🦔

CloudFormation resolve:secretsmanagerの罠

2023/07/04に公開

はじめに

resolve:secretsmanagerとは何かはここに詳しくのってます。

イメージとしては、以下のようにテンプレート内の値をSecretsManagerから取得できます。
便利ですね。

Function:
  Type: AWS::Serverless::Function
  Properties:
    FunctionName: "Hello_World"
    MemorySize: 2048
    CodeUri: .
    Handler: main
    Runtime: go1.x
    Environment:
      Variables:
        DB_PASSWORD: !Join ['', ['{{resolve:secretsmanager:', !ImportValue SecretsArn, ':SecretString:DB_PASSWORD}}']]

何の罠があるのか

上のテンプレートのDB_PASSWORDが要らなくなったので、SecretsManagerからキーを削除して、テンプレートも以下に更新します。

Function:
  Type: AWS::Serverless::Function
  Properties:
    FunctionName: "Hello_World"
    MemorySize: 2048
    CodeUri: .
    Handler: main
    Runtime: go1.x

そしてデプロイしてみましょう。
そうすると、以下のようなエラーメッセージが表示されてしまいます。

Could not find a value associated with JSONKey in SecretString

参照していないはずなのにおかしいです。

なぜなのか

公式のissueがありますが、CloudformationのDeploy時に過去のテンプレートファイルのSecrets Keyが参照されてしまうようです。

対処法

テンプレートは以下のままでOKで、SecretsManagerに削除したKeyを一時的に追加します。(Valueは空でOK)

Function:
  Type: AWS::Serverless::Function
  Properties:
    FunctionName: "Hello_World"
    MemorySize: 2048
    CodeUri: .
    Handler: main
    Runtime: go1.x

それでデプロイ完了です。

後処理

不要になったKeyを再度削除する必要があります。

SARAH Tech Blog

Discussion