目的
クラウドフォーメーションで定義したリソースの戻り値を用いることが多々あるかと思います。
「文字列+リソースの戻り値」みたいにしたい場合に覚えておくと便利な記述方法になります。
例えば、ECSのコンテナ定義でドッカーイメージを定義する際、ECRのリポジトリのURIが必要になります。
連結方法には「Fn::Join」と「Fn::Sub」の2種類があります。それぞれのパターンを示します。
Fn::Join
############### ECR ###############
myEcr:
Type: AWS::ECR::Repository
Properties:
RepositoryName: myRepository
EncryptionConfiguration:
EncryptionType: KMS
############### ECS ###############
myTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
ContainerDefinitions:
- Name: myTask
Image:
!Join # ECRリポジトリのURI+バージョン(:latest)を連結
- ''
- - !GetAtt myEcr.RepositoryUri
- ':latest'
Fn::Sub
公式ドキュメントにも記載がありますが、マッピングで「Fn::Sub」関数を使用したケースになります。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html
############### ECR ###############
myEcr:
Type: AWS::ECR::Repository
Properties:
RepositoryName: myRepository
EncryptionConfiguration:
EncryptionType: KMS
############### ECS ###############
myTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
ContainerDefinitions:
- Name: myTask
Image:
!Sub # ECRリポジトリのURI+バージョン(:latest)を連結
- ${Domain}:v1
- { Domain: !GetAtt myEcr.RepositoryUri }
まとめ
「Fn::Su」関数を使うほうがすっきりしますね。
どちらを使うかはお好みで。