amazon-web-services - 在CloudFormation中创建 "Mappings"的目的是什么?

标签 amazon-web-services amazon-s3 aws-cloudformation

请参阅下面的代码:

Mappings:
    RegionMap:
        us-east-1:
            bucketname: s3bucketname-us-east-1
        us-east-2:
            bucketname: s3bucketname-us-east-2
        us-west-1:
            bucketname: s3bucketname-us-west-1
        us-west-2:
            bucketname: s3bucketname-us-west-2
        ap-south-1:
            bucketname: s3bucketname-ap-south-1
        ap-northeast-2:
            bucketname: s3bucketname-ap-northeast-2
        ap-southeast-1:
            bucketname: s3bucketname-ap-southeast-1
        ap-southeast-2:
            bucketname: s3bucketname-ap-southeast-2
        ap-northeast-1:
            bucketname: s3bucketname-ap-northeast-1
        ca-central-1:
            bucketname: s3bucketname-ca-central-1
        eu-central-1:
            bucketname: s3bucketname-eu-central-1
        eu-west-1:
            bucketname: s3bucketname-eu-west-1
        eu-west-2:
            bucketname: s3bucketname-eu-west-2
        eu-west-3:
            bucketname: s3bucketname-eu-west-3
        eu-north-1:
            bucketname: s3bucketname-eu-north-1
        sa-east-1:
            bucketname: s3bucketname-east-1
        af-south-1:
            bucketname: s3bucketname-south-1
        ap-east-1:
            bucketname: s3bucketname-east-1
        ap-northeast-3:
            bucketname: s3bucketname-ap-northeast-3
        eu-south-1:
            bucketname: s3bucketname-eu-south-1
        me-south-1:
            bucketname: s3bucketname-me-south-1

Resources:
    StateS3Bucket:
        Type: AWS::S3::Bucket
        Properties:
            BucketName: !Sub "cfntf-${AWS::Region}-${AWS::AccountId}"

此代码还有更多内容,但我只包含了问题的相关片段。

总结一下 - 当使用“资源”部分中的区域和帐户 ID 直接设置存储桶名称时,为什么要包含存储桶名称的映射?

这里使用了Fn::FindInMap函数,该函数在这里用作ExecutorLambdaFunction的一部分:

ExecutorLambdaFunction:
        Type: AWS::Lambda::Function
        Properties:
            FunctionName: myfunction
            Handler: index.handler
            Role: !GetAtt ExecutorLambdaServiceRole.Arn
            Environment:
                Variables:
                    BUCKET: !Ref StateS3Bucket
            Code:
                S3Bucket: !If
                  - S3Defined
                  - !Ref S3Bucket
                  - Fn::FindInMap:
                      - RegionMap
                      - !Ref AWS::Region
                      - bucketname
                S3Key: !If
                  - S3Defined
                  - !Ref S3Key
                  - /app.zip
            Runtime: python3.8
          

最佳答案

StateS3Bucket 是根据区域和帐户 ID 构建的,但与 Mappings 部分没有任何关系。

在本例中,映射用于为 ExecutorLambdaFunction 的打包源代码所在位置提供正确的特定于区域的 S3 存储桶名称 - 这就是 Fn::FindInMap 的原因 正在 Lambda 声明中使用。


有时您可能希望拥有基于特定键的动态值 - CloudFormation Mappings部分完美解决了这个问题。

在本例中,您打包的 Lambda(源代码)指向 S3 位置,并且由于 S3 存储桶是特定于区域的,因此您需要一种方法来获取该区域的正确存储桶名称堆栈正在部署中。

ExecutorLambdaFunction必须从相关区域的 S3 存储桶加载,否则它将无法工作。

例如,当您的 Lambda 部署在 eu-west-2 中时,尝试从 us-east-1 中的存储桶加载 Lambda 源代码将不起作用> (注意:如果部署在 us-east-2 中,它将正常工作,而部署在另一个可用区域中时,它仍然在同一区域内)

即使您只想将堆栈放在一个区域,拥有 Mappings 部分也不会对您造成损害,因为它将为您的 CloudFormation 模板提供 future 证明。

如果您没有任何特定于区域的基础设施(非常罕见,但例如仅创建全局且在账户级别设置的 IAM 角色),则您不能包含该基础设施。

与在编写模板时多花 3 分钟定义和使用 Mappings 相比,您稍后会花费更多的时间来尝试添加映射 - 如果稍后您会感谢自己决定在另一个区域部署您的堆栈。

关于amazon-web-services - 在CloudFormation中创建 "Mappings"的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69552768/

相关文章:

amazon-web-services - 使用 amazon cognito 的电子邮件验证链接

amazon-web-services - AWS 中使用 cloudformation 创建的手动更新堆栈将来会导致冲突吗?

amazon-web-services - 如何在 AWS Lambda 中创建身份验证中间件

javascript - 使用 when/node 将 Amazon S3 函数转换为 promise 时出错

amazon-web-services - 当您的 s3 存储桶达到特定帐户最大限制的 90% 时发出警报或监控

aws-cloudformation - 使用模板将资源附加(导入?)到 cloudformation 堆栈

amazon-web-services - CloudFormation 模板中具有过滤器模式的 cloudwatch 指标过滤器

amazon-web-services - AWS Elastic Beanstalk和Composer

amazon-web-services - AWS 权限 - 我们是否需要在 Lambda 和 S3 上设置权限

amazon-web-services - 云形成循环依赖消防水带