!Refと!Subの使い分けについて
以下のように!Refと!GetAttは!Subで代替可能なので、全部!Subで記載する場合について考えてみる。
# !Refと!GetAtt (結果は同じ)
!Ref S3Bucket
!Sub ${S3Bucket}
# !Subと!GetAtt (結果は同じ)
!GetAtt S3Bucket.Arn
!Sub ${S3Bucket.Arn}
!Subで記載するメリット
-
!Ref
!GetAtt
!Sub
の使い分けを意識する必要がなくなる -
!Sub
だけになるのでコピペしやすい
!Subで記載するデメリット
-
${}
を書く必要がある- ただ、基本的に手入力する機会はほとんどなく結局コピペすることを考えると、
!Ref
!GetAtt
の使い分けを気にする方が高コストだと感じる
- ただ、基本的に手入力する機会はほとんどなく結局コピペすることを考えると、
!Joinの場合
ImportValueした値と文字列を結合して値を作成したい時がある。
例えばIAMポリシーのResourceセクションで {BucketArn}/prefix/{Region}/*
などを指定する場合など。
ことのき!Sub
で以下のように代替できる。
# !Joinの場合
Resource:
- !Join
- ''
- - Fn::ImportValue: !Sub output-s3-arn
- '/prefix/'
- !Ref AWS::Region
- '/*'
# !Subの場合
Resource:
- !Sub
- ${BucketArn}/prefix/${AWS::Region}/*
- BucketArn:
Fn::ImportValue: !Sub output-s3-arn
これで!Join
も不要になるのでほとんど!Sub
でなんとかなる。
まとめ
個人的には全部!Sub
で代替した方が楽だと感じた。
AWS公式や一般的な記法ではしっかり使い分けて記載されていることが多いので、再利用性を考えると多数派に合わせるのが吉ではありそうだが、!Sub
代替の知られざるデメリットなどがあればぜひ知りたい。