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 boto3
import 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 バケットを使用することは推奨されていないことに同意します] を選択し、[追加] を選択します。
詳細については、「Tutorial: 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 サービスへのアクセスを付与する」を参照してください。
関連情報
Amazon S3 からの 403 アクセス拒否エラーをトラブルシューティングするにはどうすればよいですか?
Lambda 実行ロールに Amazon S3 バケットへのアクセスを許可するにはどうすればよいですか?