微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Cloudformation 模板 - IAM 角色和 Lambda 资源

如何解决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

参考下面的源链接,这可能会有所帮助

  1. https://garbe.io/blog/2017/07/17/cloudformation-hacks/

  2. CloudFormation,apply Condition on DependsOn

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。