2020-12-02

AWS CDK で特定の Secret ID を持つ Secret へのアクセス許可を与える

この記事は AWS その2 Advent Calendar 2020 の 2 日目の記事です。前回は @kazuhito1982 さんによる AWS CDK & Step FunctionsでInputPathを加工するです。

こんにちは。acomaguと申します。AWS その2 Advent Calendar では気が向いたら CDK の Tips をいくつか投稿しようかなと思っています。今回は Secrets Manager についてです。

CDK で Secrets Manager の値を扱うには secretsmanager.Secret コンストラクトを用います。

const secret = new secretsmanager.Secret(this, 'Secret');

secret.grantRead(lambdaFunc);

上記のように新しい Secret コンストラクトを定義すると、その値はランダムな文字列になります。値を指定することはできません。

この挙動は新しいパスワードを生成しなければならない場合には便利だと思うのですが、そのようなケースは実際には少なく、既に決まっているパスワードやトークンを Secret として扱うことのほうが多いかと思います。そのような場合、Secret は手動で(コンソール等から)作成し、Secret ID を CloudFormation(CDK) 上に記載するのが正攻法になるかと思います。

CDK では以下のようなコードになります。

const secret = secretsmanager.Secret.fromSecretNameV2(this, 'Secret1', 'MySecret'); // MySecret という ID の既存の Secret をインポート

secret.grantRead(lambdaFunc);

Secret.fromSecretNameV2 という静的メソッドを利用します。少し前まで使えた Secret.fromSecretArnSecret.fromSecretName は deprecated になっているので注意してください。

尚この利用方法は該当の Secret とスタックが同一アカウント/リージョン内に存在することが前提です。もしそうでない場合は、Secret のフル ARN を指定する必要がありますので Secret.fromSecretAttributes を使います。

const secret = secretsmanager.Secret.fromSecretAttributes(this, 'Secret1', {
  secretCompleteArn: 'arn:aws:secretsmanager:eu-west-1:111111111111:secret:MySecret-f3gDy9',
});

詳しくはドキュメントを参照してみてください。CDK は GA になったモジュールでも、頻繁にメソッドが deprecated になったりするので定期的に利用するモジュールの README 等を読むことをおすすめします。