請參閱下面的代碼:
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
uj5u.com熱心網友回復:
StateS3Bucket正在根據區域和帳戶 ID 構建,但這與該部分無關Mappings。
在這種情況下,映射用于為ExecutorLambdaFunction存在打包源代碼的位置提供正確的特定于區域的 S3 存盤桶名稱- 這就是Fn::FindInMap在 Lambda 宣告中使用的原因。
有時您可能希望擁有基于特定鍵的動態值 - CloudFormationMappings部分是此問題的完美解決方案。
在這種情況下,您打包的 Lambda(源代碼)指向 S3 位置,并且由于 S3 存盤桶是特定于區域的,因此您需要一種方法來獲取部署堆疊的區域的正確存盤桶名稱。
ExecutorLambdaFunction 必須從相關區域的 S3 存盤桶中加載的代碼,否則將無法作業。
例如,us-east-1當您的 Lambda 部署在其中時,嘗試從存盤桶中加載 Lambda 源代碼將不起作用eu-west-2 (注意:如果部署us-east-2在另一個可用區中,它將起作用,它仍然在相同的區域內)地區)。
即使您只打算將堆疊放在一個區域,擁有一個Mappings部分也不會損害您的利益,因為它將在未來證明您的 CloudFormation 模板。
如果您沒有任何特定于區域的基礎設施(非常罕見,但例如僅創建全域 IAM 角色并在賬戶級別設定),則您不能包含一個。
與Mappings在撰寫模板時僅花費 3 分鐘定義和使用額外的時間相比,您將花費更多的時間來嘗試添加一個模板 - 如果您稍后決定將堆疊部署到另一個區域,您會感謝自己。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318844.html
上一篇:存盤在s3存盤桶上的檔案大小
