请参阅下面的代码:
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/