11
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CloudFormationで文字列と変数を連結する方法(Fn::Join or Fn::Sub)

Last updated at Posted at 2022-12-30

目的

クラウドフォーメーションで定義したリソースの戻り値を用いることが多々あるかと思います。
「文字列+リソースの戻り値」みたいにしたい場合に覚えておくと便利な記述方法になります。

例えば、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」関数を使うほうがすっきりしますね。
どちらを使うかはお好みで。

11
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?