Lambda 関数を使用して、1 つの Amazon S3 バケットから別のバケットにファイルをコピーするにはどうすればよいですか?
AWS Lambda 関数を使用して、Amazon Simple Storage Service (Amazon S3) バケットから別のバケットにファイルをコピーしたいと考えています。
解決策
以下の手順に従って、コピーされたファイルをソースの Amazon S3 バケットから宛先の S3 バケットにコピーする Lambda 関数を作成してください。
ソースと宛先の Amazon S3 バケットを作成します
注: 既にソースと宛先の S3 バケットを作成済みの場合は、このステップをスキップします。
次の手順を実行します:
- Amazon S3 コンソールを開きます。
- [バケットの作成] を選択します。
- [バケット名] に、ソースバケットの名前を入力します。
- [AWS リージョン] ドロップダウンリストを選択し、[AWS リージョン] を選択します。
- [バケットの作成] を選択します。
- 宛先のバケットに対して、ステップ 1~4を繰り返します。
詳細については、「バケットの作成」を参照してください。
Lambda 関数を作成します
次の手順を実行します:
-
Lambda コンソールで関数のページを開きます。
-
[関数を作成] を選択し、[一から作成] を選択します。
-
[関数名] に、関数の名前を入力します。
-
「ランタイム」ドロップダウンリストから [Python 3.11] を選択します。
-
[デフォルトの実行ロールの変更] を展開し、[基本的なアクセス許可を持つ新しいロールを作成] を選択します。
-
[関数の作成] を選択します。
-
[コード] タブを選択し、次の Python コードを貼り付けます:
import boto3import botocore import json import os import logging logger = logging.getLogger() logger.setLevel(logging.INFO) s3 = boto3.resource('s3') def lambda_handler(event, context): logger.info("New files uploaded to the source bucket.") key = event['Records'][0]['s3']['object']['key'] source_bucket = event['Records'][0]['s3']['bucket']['name'] destination_bucket = os.environ['destination_bucket'] source = {'Bucket': source_bucket, 'Key': key} try: response = s3.meta.client.copy(source, destination_bucket, key) logger.info("File copied to the destination bucket successfully!") except botocore.exceptions.ClientError as error: logger.error("There was an error copying the file to the destination bucket") print('Error Message: {}'.format(error)) except botocore.exceptions.ParamValidationError as error: logger.error("Missing required parameters while calling the API.") print('Error Message: {}'.format(error))
注: Lambda 関数が受け取るイベントオブジェクトから source_bucket 名を検索します。destination_bucket 名を環境変数として保存できます。
-
[デプロイ] を選択します。
Lambda は、関数が Amazon CloudWatch にログをアップロードするためのアクセス権を付与する [実行ロール] を作成します。詳細については、「コンソールで Lambda 関数を作成する」を参照してください。
Lambda 関数のために Amazon S3トリガーを作成します
次の手順を実行します:
- Lambda コンソールで関数のページを開きます。
- [関数] で Lambda 関数を選択します。
- [関数の概要] で、[トリガーを追加] を選択します。
- [トリガーの設定] ドロップダウンリストで、[S3] を選択します。
- [バケット] に、ソースバケットの名前を入力します。
- 「イベントタイプ」 ドロップダウンリストから、[すべてのオブジェクト作成イベント] を選択します。
注: POST、PUT、またはマルチパートアップロードイベントタイプを使用してオブジェクトをアップロードするようにこのステップを設定します。 - [入力と出力の両方に同じ S3 バケットを使用することは推奨されていないことに同意します] を選択し、[追加] を選択します。
詳細については、「チュートリアル: Amazon S3トリガーを使用してLambda 関数を呼び出す」を参照してください。
Lambda 関数の実行ロールに IAM 権限を提供
コピー先の S3 バケットにファイルをコピーするには、Lambda 関数の実行ロールに AWS ID およびアクセス管理 (IAM) 権限を追加します。次のリソースベースのポリシーに似たポリシーを使用してください:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "putObject", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::destination-s3-bucket/*" ] }, { "Sid": "getObject", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::source-s3-bucket/*" ] } ] }
注:
- destination-s3-bucket を使用する宛先の S3 バケットを、source-s3-bucket を使用するソースの S3 バケットに置き換えてください。
- リソース ARN の末尾の /* を、環境に必要なプレフィックス値に置き換えて、アクセス許可を制限してください。
- ベストプラクティスは、タスクを実行するための最小限の権限を付与することです。
- オブジェクトタグのあるオブジェクトをコピーするには、s3:GetObjectTagging 権限と s3:PutObjectTagging 権限が必要です。ソースオブジェクトに対する s3:GetObjectTagging 権限と宛先バケット内のオブジェクトに対する s3:PutObjectTagging 権限が必要です。
詳細については、「AWS サービスへのアクセスを付与する」を参照してください。
関連情報
関連するコンテンツ
- 質問済み 7ヶ月前lg...
- 質問済み 4年前lg...
- 質問済み 5年前lg...
- 質問済み 5年前lg...
- AWS公式更新しました 1年前
- AWS公式更新しました 1年前
- AWS公式更新しました 8ヶ月前