AWSのAuroraからS3へのエクスポートをLambdaで実行する

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
ラムダラムダラムダラムダラムダ……

この記事を三行にまとめると

関数を作成する
ポリシーを追加する
start_export_task
先日AuroraのデータをS3にエクスポートする方法というのを紹介しました。
そのときの記事がこれ

上記はコンソール画面から手動でエクスポートするだけでしたが、今回はこれをLambdaで実行してみたいと思います。



関数の作成

まずは関数の作成ですね。今回はPythonを使うという前提で話を進めます。

関数の作成

実行ロールはここで新しいロールを作成しても良いのですが、もし既存のロールを使用するのであれば、IAMのロールに許可ポリシーと信頼されたエンティティを自分で追加する必要があります。

許可ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole",
        "rds:StartExportTask"
      ],
      "Resource": "*"
    }
  ]
}

信頼されたエンティティ(信頼ポリシー)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

ちなみに関数作成時に新しいロールを自動で作成する場合、信頼されたエンティティの方は自動で作成されますが、上記の許可ポリシーは自動で作成されないのでどのみち自分で追加しなくてはいけません。この許可ポリシーはエクスポートを実行するのに必要なポリシーです。

個人的には無駄にロールが増えまくるのも嫌だったので、前回のエクスポート用に作成したロールに自分でポリシーをくっつけました。

エクスポートとLambdaの実行を一つのロールで行うなら信頼されたエンティティは以下のように書けばOKです。

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



コードを書く

関数が作成されたらコードの入力画面が出てくるのでエクスポートの処理を書きます。

コード(Python)

コードの中身はこんな感じです。

import boto3
from botocore.exceptions import ClientError
from datetime import datetime
from zoneinfo import ZoneInfo

client = boto3.client('rds')

def lambda_handler(event, context):
  day = datetime.now(ZoneInfo("Asia/Tokyo")).strftime("%Y%m%d")

  params = {
    'ExportTaskIdentifier': エクスポート識別子,
    'SourceArn': RDSのクラスターのARN,
    'S3BucketName': S3のバケット,
    'IamRoleArn': IAMのロールのARN,
    'KmsKeyId': KMSのARN,
    'S3Prefix': S3のプレフィックス,
    'ExportOnly': [データベースやテーブル名]
  }

  try:
    response = client.start_export_task(**params)
    print(response)
  except ClientError as e:
    print(e.response)
    raise e

  return

エクスポートはstart_export_taskという関数で実行できます。必要なパラメータは以下の通り。

ExportTaskIdentifier・・・RDSのコンソール画面でエクスポートを行う時のエクスポート識別子に相当するものです。これは一意でなければいけないので、上記の場合は日時で定期実行するようなケースを想定して、datetime関数を使って名前に年月日をくっつけています。

SourceArn・・・エクスポートを行うDBのクラスターのARN。RDSの画面からクラスターの設定タブを開くとAmazonリソースネームってのが書いてあるので、それをコピってくればOKです。

S3BucketName・・・エクスポート先のS3のバケット名。

IamRoleArn・・・エクスポートを実行するIAMのロールのARN。今回作成したロールじゃなくてエクスポート用に作成したロールです。

KmsKeyId・・・エクスポート用に作成したKey Managerment ServiceのカスタムキーのARN。項目名を見るとキーIDを設定するっぽい感じですが、キーIDじゃなくてARNを書かないとエラーになります。

S3Prefix・・・S3のプレフィックス。日時で実行する場合などは日付ごとにディレクトリを切ったりしたいと思うのでそれを書けば良いです。

ExportOnly・・・特定のデータベースやテーブルだけをエクスポートしたい場合はここにそのテーブル名などを書きます。

設定項目は以上です。あとはコードを実行すればエクスポートが開始されるはずです。






こんな感じでLambdaからもエクスポートを実行することができます。トリガーでEventBridgeを追加すれば定期実行も可能です。

定期実行に関しては今回は割愛しますが、以前RDSのインスタンスの追加をLambdaとEventBridgeで実行する記事を書いたことがあるので、もし定期実行処理もあわせてやってみたいって方はこっちの記事も見てみてください。

AWSのAuroraを時間指定でスケーリングしてみる
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください