如何解决Cloudformation 模板 - IAM 角色和 Lambda 资源
我想使用不同区域的 IAM 和 lambda 等资源创建一个 cloudformation 堆栈集。当我尝试部署这些资源时,它失败了,因为 IAM 角色是全局的,它试图在第二个区域再次创建,但整个堆栈集都失败了。
无论如何我可以提到在一个区域部署全局资源的堆栈集,以及在所有其他区域部署 lambda 之类的资源吗?
解决方法
无论如何我可以提到在一个区域部署全局资源的堆栈集,以及在所有其他区域部署 lambda 之类的资源吗?
遗憾的是没有。您必须拆分模板,以便将全局资源创建为普通区域堆栈。
,我查阅了很多资源,终于找到了解决方案。如果我们在堆栈集中拆分模板,那么我的依赖资源将中断,因为在 cloudformation 中创建是并行的。即在创建全局角色之前,lambda 将尝试部署,但会失败,因为角色不可用(lambda 需要)。
因此我们可以为每个全局资源添加一个条件,如下所示
Conditions:
RegionCheck: !Equals
- !Ref "AWS::Region"
- us-east-1
并且,在资源部分添加条件,如下所示,
Resources:
GlobalRolelambda:
Type: 'AWS::IAM::Role'
Condition: RegionCheck
Properties:
RoleName: !Ref LambdaExecutionRole
ManagedPolicyArns:
- 'arn:aws:iam::aws:policy/ReadOnlyAccess'
- 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
Path: /
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- 'sts:AssumeRole'
Policies:
- PolicyName: lambda-policy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- 'glue:GetConnections'
- 'mediastore:ListContainers'
- 'mediastore:GetContainerPolicy'
Resource: '*'
但是,这样做之后,问题仍然存在,因为如果您添加具有依赖属性的 lambda 资源,角色将在一个区域中创建,但不会在第二个区域中创建,lambda 将无法在第二个区域中创建。我们需要在模板中添加一个等待条件来处理这个,如下条件:
CreateLambdaRole: !Equals [ !Ref LambdaRoleName,'false' ]
CreateLamdaRoleRegion: !And
- !Condition RegionCheck
- !Condition CreateLambdaRole
并且,在角色资源之后添加以下资源,
CreateRoleWaitHandle:
Condition: CreateLamdaRoleRegion
DependsOn: GlobalRolelambda
Type: "AWS::CloudFormation::WaitConditionHandle"
#added,since DependsOn: !If is not possible,trigger by WaitCondition if CreateLamdaRoleRegion is false
WaitHandle:
Type: "AWS::CloudFormation::WaitConditionHandle"
#added,since DependsOn: !If is not possible
WaitCondition:
Type: "AWS::CloudFormation::WaitCondition"
Properties:
Handle: !If [CreateLamdaRoleRegion,!Ref CreateRoleWaitHandle,!Ref WaitHandle]
Timeout: "1"
Count: 0
现在,在 lambda 资源中引用这个,
lambdaProcessorFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: Lambda-processor
Description: ''
Handler: index.handler
Role:
Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/LambdaExecutionRole'
Runtime: python3.6
Timeout: 600
MemorySize: 1024
Code:
S3Bucket: !Ref SourceBucketName
S3Key: !Ref SourceBucketKey
DependsOn: WaitCondition
参考下面的源链接,这可能会有所帮助
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。