RDSの設定はKMSでEncryptして書く
Key Management Service (KMS) からEncrypt用のKeyを作成する (Consoleでできるので詳細割愛)
KMSのAccess権をLambdaのRoleに与える
KMSをLambdaが操作できるように、KMSを使ってDecryptできるPolicyを作成し、LambdaにつけるRoleに付与する
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "arn:aws:kms:<region>:<user_id>:key/<key_id>
}
]
}
LambdaはRDSと同じVPCを指定する
LambdaにVPCが指定されると、NATを設定しない限り、Internetへ出れなくなるので、RDSがLambdaのVPCの外にあると、指定したRDSのEndpointからresolveした先はPublicのIpとなりInternet経由で接続しようとするので、特に理由がない場合は、同じVPCにして、内部ネットワークでのアクセスにする。
別のVPCである必要がある場合は、Peer Connectionを貼って、RDSに内部IPでアクセスで切るかと思ったが、うまくいかなかったので、なにか設定が必要かも。(特に調べてない)
LambdaにVPCAccessの権限をRoleに与える
VPCを設定すると、LambdaにVPCの権限が必要になる。
AWS managed AWSLambdaVPCAccessExecutionRole
という名前のPolicyがあるので、これをLambdaのRoleに付与する(policyのくせに名前がRoleというなんとも分かりづらいもの)
内容は以下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
Lambdaの設定
Credentialsを環境変数に書き、作成したKMSを指定。
Encryptボタンを押すと、Encryptされる
右側の Code
をクリックするとLambdaの中でどう使えばいいのかが出てくる
これで、Lambda関数のConsole上で直接パスワードなどが見れなくなった。
まとめ
- KMSの作成
- Lambdaのロールには、VPCアクセス、KMS権限の付与をする
- Credentialsは環境変数にEncryptされたものを入れる
- Credentialsを実際に使用する部分は、Lambdaの関数内でKMSを使ってDecryptして使用する