💎
S3 Batch Operations の AWS Lambda で Ruby を使うときのサンプルコード
はじめに
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