📨

【AWS】RDSのスナップショットをS3に定期エクスポートする方法

2024/05/13に公開

まずはじめに

Webエンジニア兼事業開発者のTeruie Obataです。
今回はRDSのスナップショットをBigQueryにインポートし、Looker Studioで視覚化したい!
の第1章としてRDSのスナップショットをS3に定期エクスポートする方法について解説したいと思います。

関連記事一覧

今回触れないこと

  • AWSのサービス紹介
  • S3の作成
  • KMSの作成
    • 私の場合カスタマー管理型(その他デフォルト値)で作成しました。
  • AWSとBigQueryの接続
  • BigQueryとLooker Studioの接続

簡単な構成図


流れとしては以下のような段階を踏んでいます。

  1. RDSのスナップショットを作成
  2. EventBridgeからLambda関数を実行
  3. S3にスナップショットをエクスポート

いざ実践

それでは実際にやってみましょう。

スナップショットをS3にエクスポートするために必須なポリシー作成

まず初めにスナップショットをS3にエクスポートするために必要なポリシーを作成していきます。
今回はJSON形式で設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject*",
                "s3:GetObject*",
                "s3:DeleteObject*"
            ],
            "Resource": [
                "arn:aws:s3:::[エクスポート先のS3バケット名]",
                "arn:aws:s3:::[エクスポート先のS3バケット名]/*"
            ]
        }
    ]
}

スナップショットをS3にエクスポートするために必須なロール作成

次にスナップショットをS3にエクスポートするために必要なロールを作成します。

以下の値で作成します。
エンティティタイプ : AWSのサービスを指定
ユースケース : RDS - Add Role to Databaseを指定

次へをクリックすると許可ポリシー設定があるので一つ前で作成したポリシーを選択しましょう。

ロールの信頼関係書き換え

ロールの作成が完了したら信頼ポリシーの書き換えを行います。
今回もJSON形式で設定していきましょう。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "export.rds.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Lambdaの関数作成

続いてはスナップショットをS3にエクスポートさせるためのLambda関数を作成していきます。
※値は適宜下記画像を参考にしてください

Lambdaに関するポリシーとロールを作成

Lambda関数作成時に基本的なLambdaアクセス権限で新しいロールを作成を選択したのでAWSLambdaBasicExecutionRole-[uuid] などの新しいロールが作成されていると思います。
確認できましたら再度ポリシーを新規で作成し、Lambda関数作成時に作成されたロールにアタッチしていきましょう。
こちらもJSON形式で記述していきます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole",
                "rds:StartExportTask"
            ],
            "Resource": "*"
        }
    ]
}

Lambdaコードの作成

Lambdaコードの作成を行なっていきます。

import json
import boto3
from datetime import datetime

SOURCE_ARN="" # エクスポート対象とするRDSスナップショットのARN
S3_BUCKET_NAME="" # 出力先のS3バケット名
IAM_ROLE_ARN="" # S3にエクスポートする際に使用するロールのARN
KMS_KEY_ID="" # 作成したKMSキーのARN

client = boto3.client('rds')

def lambda_handler(event, context):

    export_task_identifier="mysnapshot" + datetime.now().strftime("%Y%m%d%H%M%S")

    response = client.start_export_task(
        ExportTaskIdentifier=export_task_identifier,
        SourceArn=SOURCE_ARN,
        S3BucketName=S3_BUCKET_NAME,
        IamRoleArn=IAM_ROLE_ARN,
        KmsKeyId=KMS_KEY_ID,
        )

KMSのユーザーにLambdaのロールを追加

事前に作成してあるKMSキーユーザーにLambdaのロールを追加しましょう。

定期実行の設定

作成したLambda関数の編集ページからトリガーを設定します。
今回は24時間に1回実行したいのでEventBridgeを指定し以下のように設定します。

まとめ

お疲れ様でした!
あとは設定した時間に実行できているか確かめましょう!

今回はRDSのスナップショットを定期的にエクスポートする方法を説明しました。
一件のみ取得したいのであればRDSのアクションからS3にエクスポートすれば良いのですが、定期的に取得したい場合があると思います。
今回のやり方だとEventBridgeから定期的にLambda関数を実行できるのでぜひ試してみてください

参考記事1
参考記事2

Discussion