CloudFormationでDMS Endpointを実装しSecrets Managerの値をtemplate内で使用する

結論

CloudFormationの記法resolveを使う

調査に至った背景

CloudFormationを使ってDMSのEndpointを作成するため、DatabaseのUsernameとPasswordが必要だけども、それらの値はSecrets Managerに設定している値を使用したかった

解決方法

CloudFormationの記法resolveを使う

実装したCloudFormation(yaml)の例

Resources:
  SourceEndpoint:
    Type: AWS::DMS::Endpoint
    DependsOn:
      - SampleSecretsManager
    Properties:
      EndpointIdentifier: sample-endpoint-source
      EndpointType: source
      EngineName: Oracle
      DatabaseName: SAMPLE_DB
      Port: 1521
      Username: '{{resolve:secretsmanager:sample-secres:SecretString:USERNAME}}'
      Password: '{{resolve:secretsmanager:sample-secres:SecretString:PASSWORD}}'
      ServerName: xxx.xxx.xxx.xxx
      SslMode: none
      Tags:
        - Key: group
          Value: sample

上記のUsername, Passwordでresolveを使っている

Username: '{{resolve:secretsmanager:sample-secres:SecretString:USERNAME}}'
Password: '{{resolve:secretsmanager:sample-secres:SecretString:PASSWORD}}'

公式ドキュメントを見てみる

動的な参照を使用してテンプレート値を指定する – AWS CloudFormation

{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}

と記載はあるけども、実際に使う時は{{resolve:secretsmanager:your-secret-id:SecretString:your-reference-key}}の形式になりそう

つまりSecrets Mangerから値を取得すると仮定すると
resolve:secretsmanager:xxxxxxxx:SecretString:xxxxxxxは固定で
secret-idは、Secrets MangerのSecret nameにあたる文字列
reference-keyは、Secret valueのSecret-keyにあたる文字列
を埋め込む流れ

結論

もっと面倒くさい方法で取得するしか道はないのでは、と身構えていたけど簡単だったので安心しました