#amazon-web-services #amazon-cloudformation
#amazon-веб-сервисы #aws-облачная информация
Вопрос:
Это текущая роль, которую я использую, которая создается с помощью IAM console.
Затем я попытался создать другую роль с тем же разрешением, используя cloudformation, ссылаясь на приведенное ниже руководство.
https://blog.petej.org/2020/01/04/infrastructure-as-code-with-aws-lambda-and-api-gateway/
Однако после создания ролей я обнаружил, что вся политика является встроенной политикой.
Имеет ли это какое-либо значение для моей текущей роли с точки зрения разрешений?
Я использую Role.json в качестве шаблона для стека.
Role.json
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"LambdaRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"RoleName": "hello-world-Admin",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"Service": ["lambda.amazonaws.com"]
},
"Action": ["sts:AssumeRole"]
}]
},
"Path": "/",
"Policies": [{
"PolicyName": "AWSLambdaBasicExecutionRole",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}]
}
},
{
"PolicyName": "AmazonS3GetObject",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::pj-lambda-functions/",
"arn:aws:s3:::pj-lambda-functions/*"
]
}]
}
},
{
"PolicyName": "AmazonS3FullAccess",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}]
}
},
{
"PolicyName": "AmazonDynamoDBFullAccess",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dynamodb:*",
"dax:*",
"application-autoscaling:DeleteScalingPolicy",
"application-autoscaling:DeregisterScalableTarget",
"application-autoscaling:DescribeScalableTargets",
"application-autoscaling:DescribeScalingActivities",
"application-autoscaling:DescribeScalingPolicies",
"application-autoscaling:PutScalingPolicy",
"application-autoscaling:RegisterScalableTarget",
"cloudwatch:DeleteAlarms",
"cloudwatch:DescribeAlarmHistory",
"cloudwatch:DescribeAlarms",
"cloudwatch:DescribeAlarmsForMetric",
"cloudwatch:GetMetricStatistics",
"cloudwatch:ListMetrics",
"cloudwatch:PutMetricAlarm",
"datapipeline:ActivatePipeline",
"datapipeline:CreatePipeline",
"datapipeline:DeletePipeline",
"datapipeline:DescribeObjects",
"datapipeline:DescribePipelines",
"datapipeline:GetPipelineDefinition",
"datapipeline:ListPipelines",
"datapipeline:PutPipelineDefinition",
"datapipeline:QueryObjects",
"ec2:DescribeVpcs",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups",
"iam:GetRole",
"iam:ListRoles",
"kms:DescribeKey",
"kms:ListAliases",
"sns:CreateTopic",
"sns:DeleteTopic",
"sns:ListSubscriptions",
"sns:ListSubscriptionsByTopic",
"sns:ListTopics",
"sns:Subscribe",
"sns:Unsubscribe",
"sns:SetTopicAttributes",
"lambda:CreateFunction",
"lambda:ListFunctions",
"lambda:ListEventSourceMappings",
"lambda:CreateEventSourceMapping",
"lambda:DeleteEventSourceMapping",
"lambda:GetFunctionConfiguration",
"lambda:DeleteFunction",
"resource-groups:ListGroups",
"resource-groups:ListGroupResources",
"resource-groups:GetGroup",
"resource-groups:GetGroupQuery",
"resource-groups:DeleteGroup",
"resource-groups:CreateGroup",
"tag:GetResources"
],
"Effect": "Allow",
"Resource": "*"
},
{
"Action": "cloudwatch:GetInsightRuleReport",
"Effect": "Allow",
"Resource": "arn:aws:cloudwatch:*:*:insight-rule/DynamoDBContributorInsights*"
},
{
"Action": [
"iam:PassRole"
],
"Effect": "Allow",
"Resource": "*",
"Condition": {
"StringLike": {
"iam:PassedToService": [
"application-autoscaling.amazonaws.com",
"dax.amazonaws.com"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"iam:CreateServiceLinkedRole"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"iam:AWSServiceName": [
"replication.dynamodb.amazonaws.com",
"dax.amazonaws.com",
"dynamodb.application-autoscaling.amazonaws.com",
"contributorinsights.dynamodb.amazonaws.com"
]
}
}
}
]
}
},
{
"PolicyName" : "CognitoUserPoolsManagement",
"PolicyDocument" : {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cognito-idp:ListUsers",
"Resource": "*"
}
]
}
},
{
"PolicyName" : "DynamoDBWriteAccess",
"PolicyDocument" : {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"dynamodb:PutItem",
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:Scan",
"dynamodb:UpdateItem"
],
"Resource": "arn:aws:dynamodb:us-east-1:063575524122:table/test_users"
}
]
}
},
{
"PolicyName" : "hello-world-s3-policy",
"PolicyDocument" : {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::kwai-tsing-dev/*"
}
]
}
}
]
}
},
"ApiGatewayRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"RoleName": "kwai-tsing-api-for-lambda",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"Service": ["apigateway.amazonaws.com"]
},
"Action": ["sts:AssumeRole"]
}]
},
"Policies": [{
"PolicyName": "AWSApiGateWay",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "*"
}]
}
},
{
"PolicyName": "ApiGatewayFullAccess",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"apigateway:*"
],
"Resource": "*"
}]
}
}
]
}
},
"MyRestApi": {
"Type": "AWS::ApiGateway::RestApi",
"Properties": {
"Body": {
"OpenAPI specification": null
},
"Description": "A test API",
"Name": "MyRestAPI"
}
}
}
}
С другой стороны, я хотел бы задать следующие вопросы, поскольку я новичок в aws cloudformation.
1. какой наиболее популярный вариант управления стеком — с помощью CLI или создание стека непосредственно в cloudformation console?
2. Как определить содержимое шаблона, например, если я использую api gateway, lambda и dynamodb вместе, должен ли я создать 3 отдельных файла шаблона или один файл содержит их все?
Ответ №1:
Если вы не хотите использовать встроенные политики, вам сначала нужно создать AWS ::IAM ::ManagedPolicy, а затем ссылаться на него в своей роли в ManagedPolicyArns.
Имеет ли это какое-либо значение для моей текущей роли с точки зрения разрешений?
Нет, это не так. Преимущество управляемых политик заключается в том, что вы можете создать одну политику управления и ссылаться на нее в нескольких ролях, пользователях или группах. В то время как встроенные политики всегда должны дублироваться, что усложняет управление.
1. какой наиболее популярный вариант управления стеком — с помощью CLI или создание стека непосредственно в cloudformation console?
Зависит от вашего варианта использования. Не существует единственно правильного ответа, чтобы охватить все возможные сценарии. Но если вы хотите полностью перейти на IaC, следует избегать консольных развертываний и сохранять все в виде кода под контролем источника, включая процедуры / сценарии развертывания.
Как определить содержимое шаблона, например, если я использую api gateway, lambda и dynamodb вместе, должен ли я создать 3 отдельных файла шаблона или один файл содержит их все?
Опять же, это зависит. Если они являются частью одного и того же приложения, я бы сохранил их в одном шаблоне. Как и при одном развертывании, вы создаете весь стек приложений, и то же самое происходит при его удалении. Но если они совершенно не связаны друг с другом, я бы оставил их отдельно, что дает вам больше возможностей и свободы при их модификации.
Комментарии:
1. Итак, в предоставленном мной URL-адресе преподаватель разделяет 2 шаблона для одного и того же проекта (resource.json и role.json). Как вы думаете, это хорошая практика?
2. @CCCC Основанием для разделения ролей может быть их повторное использование в нескольких стеках. Но опять же, это сильно зависит от варианта использования.
Ответ №2:
Ответ — да, будут различия, поскольку первая созданная вами роль использует управляемую политику AWS AdminstratorAccess если у вас есть встроенная политика, которая разрешает те же разрешения, тогда разницы не будет.
- Наиболее популярным является Cloudformation / Terraform / CDK / Pulumi Мне нравится использовать Cloudformation
- Если вы можете максимально разделить ресурсы на вложенные стеки Cloudformation, это лучшая практика, т.е. https://github.com/aws-samples/ecs-refarch-cloudformation/blob/master/master.yaml