aws cloudformation — контроль разрешений / процедура

#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 если у вас есть встроенная политика, которая разрешает те же разрешения, тогда разницы не будет.

  1. Наиболее популярным является Cloudformation / Terraform / CDK / Pulumi Мне нравится использовать Cloudformation
  2. Если вы можете максимально разделить ресурсы на вложенные стеки Cloudformation, это лучшая практика, т.е. https://github.com/aws-samples/ecs-refarch-cloudformation/blob/master/master.yaml