首页 文章

在CodeStar项目中的CloudFormation模板中更改Lambda的IAM角色?

提问于
浏览
3

如何在AWS CodeStar项目的CloudFormation模板中更改Lambda函数的IAM角色?

我创建了一个AWS CodeStar项目(Web服务,基于Lambda,Node.js) . 默认情况下,AWS CodeStar会生成以下CloudFormation:

AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31
- AWS::CodeStar

Parameters:
  ProjectId:
    Type: String
    Description: AWS CodeStar projectID used to associate new resources to team members

Resources:
  HelloWorld:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs4.3
      Role:
        Fn::ImportValue:
          !Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
      Events:
        GetEvent:
          Type: Api
          Properties:
            Path: /
            Method: get
        PostEvent:
          Type: Api
          Properties:
            Path: /
            Method: post

现在,我想用自己的角色替换此角色,因为我需要为Lambda函数添加策略以访问其他AWS资源 . 同时我也删除了API网关,因为我将添加一个调度程序以便稍后触发Lambda调用:

AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31
- AWS::CodeStar

Parameters:
  ProjectId:
    Type: String
    Description: AWS CodeStar projectID used to associate new resources to team members

Resources:
  HelloWorld:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs4.3
      Role: !Ref HelloWorldLambdaRole

  HelloWorldLambdaRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

但是,当我提交并推送这些更改时,AWS CodePipeline无法更新CloudFormation模板:

CREATE_FAILED AWS::IAM::Role EchoLambdaRole API: iam:CreateRole User: arn:aws:sts::[accountId]:assumed-role/CodeStarWorker-[projectId]-CloudFormation/AWSCloudFormation is not authorized to perform: iam:CreateRole on resource: arn:aws:iam::[accountId]:role/awscodestar-[projectId]-lambda-HelloWorldLambdaRole-ABCDEF123456

根据这些反馈,我得出结论, CodeStarWorker-[projectId]-CloudFormation/AWSCloudFormation 角色无权创建IAM角色 . 但是,这个角色对我的CloudFormation模板是隐藏的,据我所知,它是由CodeStar自动设置的 . 作为AWS账户管理员,我只需编辑相关的策略,但恕我直言,这不是解决此问题的方法 .


Edit:

我已在我的帐户中检查过IAM配置 . 已创建aws-codestar-service-role,它与具有以下语句的 AWSCodeStarServiceRole 策略关联(在其他语句中,请参阅链接以获取详细信息):

{
  "Sid": "ProjectWorkerRoles",
  "Effect": "Allow",
  "Action": [
    "iam:AttachRolePolicy",
    "iam:CreateRole",
    "iam:DeleteRole",
    "iam:DeleteRolePolicy",
    "iam:DetachRolePolicy",
    "iam:GetRole",
    "iam:PassRole",
    "iam:PutRolePolicy",
    "iam:SetDefaultPolicyVersion",
    "iam:CreatePolicy",
    "iam:DeletePolicy",
    "iam:AddRoleToInstanceProfile",
    "iam:CreateInstanceProfile",
    "iam:DeleteInstanceProfile",
    "iam:RemoveRoleFromInstanceProfile"
  ],
  "Resource": [
    "arn:aws:iam::*:role/CodeStarWorker*",
    "arn:aws:iam::*:policy/CodeStarWorker*",
    "arn:aws:iam::*:instance-profile/awscodestar-*"
  ]
},

还有 CodeStarWorker-[projectId]-CloudFormation 角色,它具有名为 CodeStarWorkerCloudFormationRolePolicy 的内联策略,其配置如下:

{
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::aws-chargeodestar-eu-west-1-[accountId]-[projectId]-pipeline",
                "arn:aws:s3:::aws-codestar-eu-west-1-[accountId]-[projectId]-pipeline/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "codestar:SyncResources",
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:AddPermission",
                "lambda:UpdateFunction",
                "lambda:UpdateFunctionCode",
                "lambda:GetFunctionConfiguration",
                "lambda:UpdateFunctionConfiguration",
                "lambda:RemovePermission",
                "apigateway:*",
                "dynamodb:CreateTable",
                "dynamodb:DeleteTable",
                "dynamodb:DescribeTable",
                "kinesis:CreateStream",
                "kinesis:DeleteStream",
                "kinesis:DescribeStream",
                "sns:CreateTopic",
                "sns:DeleteTopic",
                "sns:ListTopics",
                "sns:GetTopicAttributes",
                "sns:SetTopicAttributes",
                "s3:CreateBucket",
                "s3:DeleteBucket"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::[accountId]:role/CodeStarWorker-[projectId]-Lambda"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "cloudformation:CreateChangeSet"
            ],
            "Resource": [
                "arn:aws:cloudformation:eu-west-1:aws:transform/Serverless-2016-10-31",
                "arn:aws:cloudformation:eu-west-1:aws:transform/CodeStar"
            ],
            "Effect": "Allow"
        }
    ]
}

由于我已创建项目,因此 CodeStar_[projectId]_Owner 策略已直接附加到我的用户 .


Edit 2:

尽管我自己建议,但我尝试通过添加以下策略声明来更新 CodeStarWorker-[projectId]-CloudFormation 角色的内联 CodeStarWorkerCloudFormationRolePolicy

{
    "Action": [
        "iam:AttachRolePolicy",
        "iam:CreateRole",
        "iam:DeleteRole",
        "iam:DetachRolePolicy",
        "iam:GetRole",
        "iam:PassRole"
    ],
    "Resource": [
        "arn:aws:iam::699602212296:role/awscodestar-[projectId]-*"
    ],
    "Effect": "Allow"
}

但是,这会在CloudFormation中导致以下错误:

CREATE_FAILED AWS::CodeStar::SyncResources SyncResources123456789012 com.amazon.coral.service.InternalFailure

2 回答

  • 0

    CodeStar Service使用名为aws-codestar-service-role的服务角色,并带有以下语句 . 如果允许项目的动态辅助角色继承IAM角色创建操作,则可能需要修改此服务角色 . 否则CodeStar可能会覆盖您的更改 .

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "ProjectStack",
          "Effect": "Allow",
          "Action": [
            "cloudformation:*Stack*",
            "cloudformation:GetTemplate"
          ],
          "Resource": [
            "arn:aws:cloudformation:*:*:stack/awscodestar-*",
            "arn:aws:cloudformation:*:*:stack/awseb-*"
          ]
        },
        {
          "Sid": "ProjectStackTemplate",
          "Effect": "Allow",
          "Action": [
            "cloudformation:GetTemplateSummary",
            "cloudformation:DescribeChangeSet"
          ],
          "Resource": "*"
        },
        {
          "Sid": "ProjectQuickstarts",
          "Effect": "Allow",
          "Action": [
            "s3:GetObject"
          ],
          "Resource": [
            "arn:aws:s3:::awscodestar-*/*"
          ]
        },
        {
          "Sid": "ProjectS3Buckets",
          "Effect": "Allow",
          "Action": [
            "s3:*"
          ],
          "Resource": [
            "arn:aws:s3:::aws-codestar-*",
            "arn:aws:s3:::aws-codestar-*/*",
            "arn:aws:s3:::elasticbeanstalk-*",
            "arn:aws:s3:::elasticbeanstalk-*/*"
          ]
        },
        {
          "Sid": "ProjectServices",
          "Effect": "Allow",
          "Action": [
            "codestar:*Project",
            "codestar:*Resource*",
            "codestar:List*",
            "codestar:Describe*",
            "codestar:Get*",
            "codestar:AssociateTeamMember",
            "codecommit:*",
            "codepipeline:*",
            "codedeploy:*",
            "codebuild:*",
            "ec2:RunInstances",
            "autoscaling:*",
            "cloudwatch:Put*",
            "ec2:*",
            "elasticbeanstalk:*",
            "elasticloadbalancing:*",
            "iam:ListRoles",
            "logs:*",
            "sns:*"
          ],
          "Resource": "*"
        },
        {
          "Sid": "ProjectWorkerRoles",
          "Effect": "Allow",
          "Action": [
            "iam:AttachRolePolicy",
            "iam:CreateRole",
            "iam:DeleteRole",
            "iam:DeleteRolePolicy",
            "iam:DetachRolePolicy",
            "iam:GetRole",
            "iam:PassRole",
            "iam:PutRolePolicy",
            "iam:SetDefaultPolicyVersion",
            "iam:CreatePolicy",
            "iam:DeletePolicy",
            "iam:AddRoleToInstanceProfile",
            "iam:CreateInstanceProfile",
            "iam:DeleteInstanceProfile",
            "iam:RemoveRoleFromInstanceProfile"
          ],
          "Resource": [
            "arn:aws:iam::*:role/CodeStarWorker*",
            "arn:aws:iam::*:policy/CodeStarWorker*",
            "arn:aws:iam::*:instance-profile/awscodestar-*"
          ]
        },
        {
          "Sid": "ProjectTeamMembers",
          "Effect": "Allow",
          "Action": [
            "iam:AttachUserPolicy",
            "iam:DetachUserPolicy"
          ],
          "Resource": "*",
          "Condition": {
            "ArnEquals": {
              "iam:PolicyArn": [
                "arn:aws:iam::*:policy/CodeStar_*"
              ]
            }
          }
        },
        {
          "Sid": "ProjectRoles",
          "Effect": "Allow",
          "Action": [
            "iam:CreatePolicy",
            "iam:DeletePolicy",
            "iam:CreatePolicyVersion",
            "iam:DeletePolicyVersion",
            "iam:ListEntitiesForPolicy",
            "iam:ListPolicyVersions"
          ],
          "Resource": [
            "arn:aws:iam::*:policy/CodeStar_*"
          ]
        },
        {
          "Sid": "InspectServiceRole",
          "Effect": "Allow",
          "Action": [
            "iam:ListAttachedRolePolicies"
          ],
          "Resource": [
            "arn:aws:iam::*:role/aws-codestar-service-role"
          ]
        }
      ]
    }
    

    另请参阅http://docs.aws.amazon.com/codestar/latest/userguide/access-permissions.html,但您可能已经猜到了,它可以覆盖您的用例 .

  • 1

    我相信答案是CodeStar似乎与它在不同情况下创建角色所使用的命名约定不一致 . 如果在创建角色时提供前缀为 CodeStar-[projectId]* 的名称,则这将满足CodeStarWorker- [projectId] -CloudFormation角色的IAM策略 . 即包括`RoleName:!Sub 'CodeStar-$-....' .

    Further information 当我遇到同样的错误时,我还要更新IAM策略,然后注意到CodeStarWorker- [projectId] -CloudFormation角色的IAM策略中的权限边界 . 将错误中的角色与现有角色进行比较:

    错误中的角色: awscodestar-[projectId]-lambda-HelloWorldLambdaRole-ABCDEF123456 .

    CodeStar创建的角色示例代码: CodeStar-[projectId]-Execution

    另外一点是,如果您使用SAM CLI来CodeStar,这会让您感到困惑,因为CLI可以指定没有角色的lambda函数,SAM会为您创建它,例如:

    $ sam init --name test_sam
    $ cat test_sam/template.yml
    HelloWorldFunction:
        Type: AWS::Serverless::Function
        Properties:
            CodeUri: hello-world/
            Handler: app.lambdaHandler
            Runtime: nodejs8.10
            Environment: 
                Variables:
                    PARAM1: VALUE
            Events:
                HelloWorld:
                    Type: Api
                    Properties:
                        Path: /hello
                        Method: get
    

    但是,在CodeStar中这不起作用,看起来您需要遵循CodeStar的示例并指定功能资源,以及具有正确名称前缀的角色!例如

    Resources:
      HelloWorld:
        Type: AWS::Serverless::Function
        Properties:
          Handler: index.handler
          Runtime: python3.7
          Role:
            Fn::GetAtt:
            - LambdaExecutionRole
            - Arn
          Events:
            GetEvent:
              Type: Api
              Properties:
                Path: /
                Method: get
      LambdaExecutionRole:
        Description: Creating service role in IAM for AWS Lambda
        Type: AWS::IAM::Role
        Properties:
          RoleName: !Sub 'CodeStar-${ProjectId}-Execution${Stage}'
          AssumeRolePolicyDocument:
            Statement:
            - Effect: Allow
              Principal:
                Service: [lambda.amazonaws.com]
              Action: sts:AssumeRole
          Path: /
          ManagedPolicyArns:
            -  ....
    

相关问题