我正在使用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代码的副本并将其部署到帐户中,但是似乎该帐户在生成资源时会读取代码
答案 0 :(得分:1)
您需要将以下标记添加到存储桶策略中,以允许跨帐户角色对其进行访问。
{"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::awsaccount:role/crossaccount role"
]
}
}
答案 1 :(得分:0)
包含代码的存储桶需要有一个策略,该策略允许角色(用于部署堆栈集实例的角色)列出并从中获取对象。