Lambda 関数を使用して、1 つの Amazon S3 バケットから別のバケットにファイルをコピーするにはどうすればよいですか?

所要時間2分
0

AWS Lambda 関数を使用して、Amazon Simple Storage Service (Amazon S3) バケットから別のバケットにファイルをコピーしたいと考えています。

解決策

以下の手順に従って、コピーされたファイルをソースの Amazon S3 バケットから宛先の S3 バケットにコピーする Lambda 関数を作成してください。

ソースと宛先の Amazon S3 バケットを作成します

注: 既にソースと宛先の S3 バケットを作成済みの場合は、このステップをスキップします。

次の手順を実行します:

  1. Amazon S3 コンソールを開きます。
  2. [バケットの作成] を選択します。
  3. [バケット名] に、ソースバケットの名前を入力します。
  4. [AWS リージョン] ドロップダウンリストを選択し、[AWS リージョン] を選択します。
  5. [バケットの作成] を選択します。
  6. 宛先のバケットに対して、ステップ 1~4を繰り返します。

詳細については、「バケットの作成」を参照してください。

Lambda 関数を作成します

次の手順を実行します:

  1. Lambda コンソールで関数のページを開きます。

  2. [関数を作成] を選択し、[一から作成] を選択します。

  3. [関数名] に、関数の名前を入力します。

  4. ランタイム」ドロップダウンリストから [Python 3.11] を選択します。

  5. [デフォルトの実行ロールの変更] を展開し、[基本的なアクセス許可を持つ新しいロールを作成] を選択します。

  6. [関数の作成] を選択します。

  7. [コード] タブを選択し、次の 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 名を環境変数として保存できます。

  8. [デプロイ] を選択します。

Lambda は、関数が Amazon CloudWatch にログをアップロードするためのアクセス権を付与する [実行ロール] を作成します。詳細については、「コンソールで Lambda 関数を作成する」を参照してください。

Lambda 関数のために Amazon S3トリガーを作成します

次の手順を実行します:

  1. Lambda コンソールで関数のページを開きます。
  2. [関数] で Lambda 関数を選択します。
  3. [関数の概要] で、[トリガーを追加] を選択します。
  4. [トリガーの設定] ドロップダウンリストで、[S3] を選択します。
  5. [バケット] に、ソースバケットの名前を入力します。
  6. イベントタイプ」 ドロップダウンリストから、[すべてのオブジェクト作成イベント] を選択します。
    注: POST、PUT、またはマルチパートアップロードイベントタイプを使用してオブジェクトをアップロードするようにこのステップを設定します。
  7. [入力と出力の両方に同じ 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 サービスへのアクセスを付与する」を参照してください。

関連情報

Amazon S3 からの 403 アクセス拒否エラーをトラブルシューティングするにはどうすればよいですか?

Lambda 実行ロールに Amazon S3 バケットへのアクセスを許可するにはどうすればよいですか?

AWS公式
AWS公式更新しました 5ヶ月前
コメントはありません