Amazon cloudformation Cloudformation模板-IAM角色和Lambda资源

Amazon cloudformation Cloudformation模板-IAM角色和Lambda资源,amazon-cloudformation,Amazon Cloudformation,我想用不同地区的IAM和lambda等资源创建一个cloudformation堆栈集。当我尝试部署这些资源时,它失败了,因为IAM角色是全局的,它正在尝试在第二个区域中再次创建,而整个堆栈集都失败了 我是否可以提到stackset在一个区域部署全局资源,在所有其他区域部署像lambda这样的资源 我是否可以提到stackset在一个区域部署全局资源,在所有其他区域部署像lambda这样的资源 可惜没有。您必须拆分模板,以便将全局资源创建为正常的区域堆栈。我浏览了许多资源,最终找到了一个解决方案。

我想用不同地区的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
请参阅下面的源链接,这可能会有所帮助


  • 进展如何?还不清楚为什么你不能做你想做的事?这最终在全球资源中通过一些条件检查起到了作用,我已经回答了这个问题,所以它将对其他人有用