Amazon cloudformation Cloudformation模板-IAM角色和Lambda资源
我想用不同地区的IAM和lambda等资源创建一个cloudformation堆栈集。当我尝试部署这些资源时,它失败了,因为IAM角色是全局的,它正在尝试在第二个区域中再次创建,而整个堆栈集都失败了 我是否可以提到stackset在一个区域部署全局资源,在所有其他区域部署像lambda这样的资源 我是否可以提到stackset在一个区域部署全局资源,在所有其他区域部署像lambda这样的资源Amazon cloudformation Cloudformation模板-IAM角色和Lambda资源,amazon-cloudformation,Amazon Cloudformation,我想用不同地区的IAM和lambda等资源创建一个cloudformation堆栈集。当我尝试部署这些资源时,它失败了,因为IAM角色是全局的,它正在尝试在第二个区域中再次创建,而整个堆栈集都失败了 我是否可以提到stackset在一个区域部署全局资源,在所有其他区域部署像lambda这样的资源 我是否可以提到stackset在一个区域部署全局资源,在所有其他区域部署像lambda这样的资源 可惜没有。您必须拆分模板,以便将全局资源创建为正常的区域堆栈。我浏览了许多资源,最终找到了一个解决方案。
可惜没有。您必须拆分模板,以便将全局资源创建为正常的区域堆栈。我浏览了许多资源,最终找到了一个解决方案。如果我们在stackset中拆分模板,那么我的依赖资源将中断,因为在cloudformation中创建是并行的。i、 e.在创建全局角色之前,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: '*'
但是,这样做之后,问题仍然存在,因为如果添加具有depends-depen属性的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
请参阅下面的源链接,这可能会有所帮助
进展如何?还不清楚为什么你不能做你想做的事?这最终在全球资源中通过一些条件检查起到了作用,我已经回答了这个问题,所以它将对其他人有用