1. Parameter Storeの設定
- AWS Management ConsoleからSystems Managerを開く(スクリーンショット1)
- 画面内で、Parameter Storeの管理画面に遷移する
- Systems Managerサービスのフィーチャーのため、Systems Managerの画面の左のメニューから探す
create parameter
ボタンから、パラメータを作成する(スクリーンショット2)
- 秘匿情報はSecrets Managerに保存するため、こちらには保存しない。
2. Secrets Managerの設定
- AWS Management ConsoleからSecrets Managerを開く
- Step1でOther type of secretを選択し、plaintextタブを選んで値を入力する(スクリーンショット1)
- Step2でこのSecretに名前をつける(スクリーンショット2)
- Step3はそのまま次へ進む
3. AWS CDKコード(TypeScript、v1)
const someHandler = new lambda.Function(this, 'someHandler', {
runtime: lambda.Runtime.NODEJS_16_X,
code: lambda.Code.fromAsset('../backend/dist/handler'),
environment: {
SOME_ENV_VAR: 'hard-coded',
ENVIRONMENT:
// Parameter Store
ssm.StringParameter.fromStringParameterAttributes(this, 'SomeHandlerParam1', {
parameterName: 'someApp/backend/ENVIRONMENT'
}).stringValue,
SOME_CREDENTIAL:
// Secrets Manager
secretsmanager.Secret.fromSecretNameV2(this, 'SomeHandlerParam2', 'someApp/backend/credentials')
.secretValue.toString()
},
handler: 'handler.handler',
memorySize: 1024
})
※動作するプロダクションコードを上記スクリーンショットに合わせて手直ししております。もしスクリーンショットとの矛盾に気づかれましたら、ご指摘ください。
注意点
1. 設計について
CDKを実行しているマシン上で、実際のSecrets ManagerやParameter Store上の値を取得しようとすることは望ましくない。
このようにしてLambdaに環境変数を設定すると、CloudFormationテンプレート上に値が出てしまい、CloudFormationを参照できるIAMはそうした値を知ることができてしまい、セキュリティリスクにつながる。(公式より)
この記事で説明しているコードは、望ましい設計となっている。先述のアーキテクチャ図にあるとおり、CloudFormationの動的参照機能を活用しており、ローカルマシン上で値を取得しないためである。
2. Secrets Managerの費用について
- Secrets Managerは1パラメータあたり0.4USD/月 + 少々(リクエスト分)かかる。
- 費用対策として、同一アプリケーションで秘匿したい値が複数ある場合は、それらをJSONとして設定することが可能。以下のようなコードにすることで、シークレットの値をJSONとして扱い、キーを指定して値を抽出することが可能。
secretsmanager.Secret.fromSecretNameV2(this, 'SomeHandlerParam2', 'someApp/backend/credentials')
.secretValueFromJson('someKey').toString()
3. 環境変数の変更について
Parameter StoreやSecrets Manager上で環境変数を変更しても、Lambdaに反映されるわけではない点は注意が必要である。
少々手間だが、以下2点の方法で環境変数を変更可能である。
- 方法1. Parameter StoreやSecrets Manager上で値を更新して、同じ値をLambdaに手動で入れる
- 方法2. Parameter StoreやSecrets Manager上で値を更新して、再度CDKのデプロイを走らせる。
cdk deploy
は生成されたCloudFormationテンプレートに差分が違いがないとデプロイされないことに注意。-f
オプションをつけることで強制的にデプロイが可能。