Lambda から RDS の Snapshot を S3 バケットにエクスポートする方法について解説します。
特に構成とサービスと適用するIAMロールと権限について解説します。
RDS の Snapshot を S3 バケットにエクスポートできます。
しかもエクスポート作業はバックグラウンドで実行されるため、RDS インスタンスのパフォーマンスには影響しません。
スナップショットをエクスポートすると、RDS はスナップショットからデータを抽出して S3 バケットに保存します。
手動でもできますが Lambda と EventBridge を利用して定期的に自動化して実行できます。
以下の記事は Glue を利用してデータソースから ETL 処理を実行するためのロールとポリシーの設計なので参考にしてください。
【AWS】Glue Crawler のロールとポリシーの設計
【AWS】Glue Job のロールとポリシーの設計
■参考サイト
Amazon S3 への DB スナップショットデータのエクスポート
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ExportSnapshot.html
AWS LambdaとEventbridgeでRDSのS3エクスポートを自動化する
https://www.seeds-std.co.jp/blog/creators/2022-07-22-143712
Lambda(Python)でRDSスナップショットをS3にエクスポートする
https://qiita.com/hmdsg/items/a948b8e30eb5503438af
目次
構成図
以下が構成図となります。
RDSが稼働しています。
登場人物は以下となります。
- Lambda
- Lambda にアタッチする IAM ロール
- RDS
- スナップショット
- S3 バット
- KMSキー

設計
以下のように設計します。
- Lambda(export-rds-snapshot-to-s3-test-lamnbda)は data-lake-test-lambda-role ロールをアタッチしている。
- Lambda(export-rds-snapshot-to-s3-test-lamnbda)のプログラムから data-lake-test-export-role ロールを呼び出している。
- Lambda(export-rds-snapshot-to-s3-test-lamnbda)は RDS(data-lake-test-rds)の Snapshot の data-lake-test-snapshot を S3 バケット(data-lake-snapshot-rds-test-s3)にエクスポートする。
各ロールとポリシー設計
各ロールとロールに割り当てるポリシーを以下のように設計します。
data-lake-test-lambda-role のポリシー
data-lake-test-lambda-role のポリシーは以下のようになります。
まずはロールに割り当てる信頼ポリシーです。
このロールは Lambda を実行するので “Service”: “lambda.amazonaws.com” を設定します。
この設定により data-lake-test-lambda-role は export-rds-snapshot-to-s3-test-lamnbda 関数に割り当てることができるようになり、実行することができるようになります。
■ロールに割り当てる信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
次に Lambda が実行できるように AWSLambdaBasicExecutionRole ポリシーを割り当てます。これはカスタムポリシーではなくマネージドポリシーとなります。
Lambda を実行する際に CloudWatch Logs に対する権限が必要になります。
■AWSLambdaBasicExecutionRole(マネージドポリシー)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
■data-lake-test-lambda-role-policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:PassRole",
"rds:StartExportTask"
],
"Resource": "*"
}
]
}
data-lake-test-export-role のポリシー
data-lake-test-export-role のポリシーの設定をします。
このポリシーは export-rds-snapshot-to-s3-test-lamnbda 関数から呼び出されるポリシーとなります。
処理内容は RDS の Snapshot を S3 バケットにエクスポートすることです。そのため “export.rds.amazonaws.com” を設定しています。
■ロールに割り当てる信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "export.rds.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Snapshot を S3 バケットにエクスポートする為以下の権限を割り当てています。
■data-lake-test-export-role-s3-policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SnapshotExportPolicy",
"Effect": "Allow",
"Action": [
"s3:PutObject*",
"s3:ListBucket",
"s3:GetObject*",
"s3:DeleteObject*",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::data-lake-snapshot-rds-test-s3",
"arn:aws:s3:::data-lake-snapshot-rds-test-s3/*"
]
}
]
}
Snapshot を KMS キーで暗号化し S3 バケットに保存する為、以下の権限を割り当てています。
■data-lake-test-export-role-s3-policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow use of KMS key in account 1111111111",
"Effect": "Allow",
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:CreateGrant",
"kms:DescribeKey",
"kms:RetireGrant"
],
"Resource": "arn:aws:kms:ap-northeast-1:111111111111:key/xxxxxxxxxxxxxxxxxxxxxxx"
}
]
}
参考サイト
IAM ロールを使用した Amazon S3 バケットへのアクセスの提供
DB スナップショットデータを Amazon S3 にエクスポートする前に、スナップショットエクスポートタスクに対して Amazon S3 バケットへの書き込みアクセス権限を付与します。
これを行うには、 バケットへのアクセスを提供する IAM ポリシーを作成します。次に IAM ロールを作成して、このロールにポリシーをアタッチします。後で IAM ロールをスナップショットエクスポートタスクに割り当てます。
「スナップショットエクスポートタスクに対して Amazon S3 バケットへの書き込みアクセス権限を付与します。」とあるので実際にエクスポートする data-lake-test-export-role ロールに対してアクセス権限を追加することになります。

