💎

S3 Batch Operations の AWS Lambda で Ruby を使うときのサンプルコード

2022/08/21に公開

はじめに

S3 Batch Operations で AWS Lambada (以下 Lambda) を利用できる。
Lambda が使えるということは Ruby が使えるということ。
しかし、ググっても Ruby を使ったサンプルコードが見つからなかったので、備忘録としてまとめておく。
Lambda のコード以外の設定はこの記事では扱わないため、適宜設定すること。

環境

  • Lambda ランタイム: Ruby 2.7

サンプルコードの概要

コピー元のバケットのデータを読み込んで、コピー先のバケットに書き込むだけの Lambda となっている。
AWS SDK for Ruby が使えるので、要件に合わせて適宜調整して欲しい。

Lambda のサンプルコード (Ruby)

lambda_function.rb
# frozen_string_literal: true

require 'aws-sdk-s3'

NEW_BUCKET_NAME = 'コピー先のバケット名'
AWS_REGION = 'ap-northeast-1'

def lambda_handler(event:, context:)
  task = event['tasks'][0]
  task_id = task['taskId']
  s3_bucket = task['s3BucketArn'].split(':')[-1]
  s3_key = task['s3Key']

  invocation_id = event['invocationId']
  invocation_schema_version = event['invocationSchemaVersion']

  client = Aws::S3::Client.new(region: AWS_REGION)
  io = client.get_object(bucket: s3_bucket, key: s3_key).body
  client.put_object(bucket: NEW_BUCKET_NAME, key: s3_key, body: io)
  io.close

  {
    invocationSchemaVersion: invocation_schema_version,
    treatMissingKeysAs: "PermanentFailure",
    invocationId: invocation_id,
    results: [
      {
        taskId: task_id,
        resultCode: "Succeeded",
        resultString: "Succeeded key: #{s3_key}"
      }
    ]
  }
end

Lambda のテスト実行時の JSON

{
"invocationSchemaVersion": "1.0",
    "invocationId": "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo",
    "job": {
        "id": "f3cc4f60-61f6-4a2b-8a21-d07600c373ce"
    },
    "tasks": [
        {
            "taskId": "dGFza2lkZ29lc2hlcmUK",
            "s3Key": "example.jpg",
            "s3VersionId": "1",
            "s3BucketArn": "arn:aws:s3:::コピー元のバケット名"
        }
    ]
}

Amazon S3 バッチ操作での AWS Lambda の使用 - AWS Lambda を参考に作った。

まとめ

S3 Batch Operations は Ruby でも簡単に使える。

Discussion