lambdaからRDSにアクセスするときに注意すること
lambdaからRDSにアクセスするときに注意すること:
Key Management Service (KMS) からEncrypt用のKeyを作成する (Consoleでできるので詳細割愛)
KMSをLambdaが操作できるように、KMSを使ってDecryptできるPolicyを作成し、LambdaにつけるRoleに付与する
LambdaにVPCが指定されると、NATを設定しない限り、Internetへ出れなくなるので、RDSがLambdaのVPCの外にあると、指定したRDSのEndpointからresolveした先はPublicのIpとなりInternet経由で接続しようとするので、特に理由がない場合は、同じVPCにして、内部ネットワークでのアクセスにする。
別のVPCである必要がある場合は、Peer Connectionを貼って、RDSに内部IPでアクセスで切るかと思ったが、うまくいかなかったので、なにか設定が必要かも。(特に調べてない)
VPCを設定すると、LambdaにVPCの権限が必要になる。
AWS managed
内容は以下:
Credentialsを環境変数に書き、作成したKMSを指定。
Encryptボタンを押すと、Encryptされる
右側の
これで、Lambda関数のConsole上で直接パスワードなどが見れなくなった。
RDSの設定はKMSでEncryptして書く
Key Management Service (KMS) からEncrypt用のKeyを作成する (Consoleでできるので詳細割愛)
KMSのAccess権をLambdaのRoleに与える
KMSをLambdaが操作できるように、KMSを使ってDecryptできるPolicyを作成し、LambdaにつけるRoleに付与するallow-lambda-to-decrypt-policy
{ "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というなんとも分かりづらいもの)内容は以下:
AWSLambdaVPCAccessExecutionRole
{ "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して使用する
コメント
コメントを投稿