使用AWS Stacksets部署Lambda资源

时间:2019-07-16 19:32:48

标签: amazon-web-services aws-lambda amazon-cloudformation

我正在使用AWS CloudFormation堆栈集将资源部署到不同的账户。 Lambda资源需要S3Bucket,ObjectKey和ObjectVersion来引用包含代码的zip文件。此代码位于主帐户的S3存储桶中。

将堆栈实例部署到帐户时,该帐户无法访问zip文件来创建lambda,因为它位于主服务器中,并且出现此错误:

  

您的访问已被S3拒绝,请确保您的请求凭据具有存储桶名称/python_lambdas.zip的GetObject权限。 S3错误代码:AccessDenied。 S3错误消息:访问被拒绝(服务:AWSLambdaInternal;状态代码:403;错误代码:AccessDeniedException;请求ID:XXX)”

我试图允许帐户中的角色在有权访问S3存储桶的主服务器中担任角色。但是,我相信cloudformation负责人正在尝试从Web访问存储桶,而不是承担主服务器中的角色。

这是资源:

GenericLambda:
  Type: AWS::Lambda::Function
  Properties:
    Code:
      S3Bucket: !Ref LambdaBucket
      S3Key:  !Ref LambdaObjectKey
      S3ObjectVersion: !Ref LambdaObjectVersion
    FunctionName: UserAccessLambda
    Handler:  index.handler
    Role: !GetAtt ExecutionRole.Arn
    Runtime:  python3.6

我希望堆栈集可以创建lambda代码的副本并将其部署到帐户中,但是似乎该帐户在生成资源时会读取代码

2 个答案:

答案 0 :(得分:1)

您需要将以下标记添加到存储桶策略中,以允许跨帐户角色对其进行访问。

{"Action": [
            "s3:GetObject",
            "s3:ListBucket"

            ],
    "Effect": "Allow",
                "Principal": {
                        "AWS": [
                            "arn:aws:iam::awsaccount:role/crossaccount role"
                                ]
                            }
}

答案 1 :(得分:0)

包含代码的存储桶需要有一个策略,该策略允许角色(用于部署堆栈集实例的角色)列出并从中获取对象。