Slack Bot トークンを AWS Secrets Manager に保存して、Lambda からアクセスできるようにしたい。
今回は自動化せず、コンソールから作成してアクセスするところまでまとめておく。
CONTENTS
- AWS Key Management Service にキーを追加する
- AWS Secrets Manager にシークレットを追加する
- javascript からシークレットを取得する
- まとめ
- 参考資料
ENVIRONMENTS
- Node.js 10.16.0
AWS Key Management Service にキーを追加する
AWS Secrets Manager を利用するためには KMS にキーを登録する必要がある。
AWS のコンソールから Key Management Service を開いて、「キーの作成」を行う。
- エイリアス : このキーの名前みたいなもの。あとでシークレットを作成するときに参照する
- キー管理者 : このキーを管理できるユーザー。指定しなくても大丈夫
- キーのアクセス許可 : デプロイするときのユーザーと lambda のロールを選択
これで KMS キーの登録が完了する。 キーとシークレットは lambda ごとに作成するので、名前は lambda に対応してつけておく。
AWS Secrets Manager にシークレットを追加する
AWS のコンソールから Secrets Manager を開いて、「シークレットの保存」を行う。
- シークレットの種類 : 今回は Slack Bot のトークンを保存したいので、「その他のシークレット」を選択
- シークレットキー / 値 : Slack Bot のトークンを指定
- 暗号化キー : 先ほど作成した KMS のキーを選択
- シークレットの名前 : lambda に対応したものをつける
- 自動ローテーション : 今回は Slack Bot のトークンなので、ローテーションは無効にしておく
これでシークレットの保存が完了する。
今回保存する Slack Bot トークンは定期的に変更する予定がないため、自動ローテーションは無効にした。
javascript からシークレットを取得する
Secrets Manager のサンプルコードを参考にして、シークレットを取得するコードを試してみる。
const AWS = require("aws-sdk"); /** * env : { * region: aws region * secret_id: secret id : see aws secret manager * } */ const get = (env) => { return new Promise((resolve, reject) => { new AWS.SecretsManager({ region: env.region, }).getSecretValue({SecretId: env.secret_id}, (err, data) => { if (err) { reject(err); } else { resolve(JSON.parse(data.SecretString)); } }); }); };
このコードを KMS でキーのアクセスを許可したユーザーかロールから実行すると、保存したデータが取得できる。
なお、実行するユーザーには以下のポリシーが必要。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "SID", "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "resource-ARN" } ] }
まとめ
AWS Secrets Manager にシークレットを保存する方法をまとめた。