📄
LambdaでAPIにリクエストして取得したレスポンスをS3にアップロードする
やりたいこと
業務で運用している自社サイトのAPIにリクエストして取得できるレスポンスをS3にアップロードしたい。
実装
これを以下の方法で実現します。
- LambdaからあるAPIにリクエストしてレスポンスを取得する
- ステータスコードが200番台の場合は、レスポンスをS3にアップロードする
- Rubyで実装する
S3の設定
S3にLambdaからアップロードされるファイルを置くバケットを作成します。
特に設定は触らず、デフォルトの設定にしました。
Lambdaの設定
Lambdaで関数を作成します。今回は「一から作成」を選択しました。ランタイムは「Ruby 2.7」です。
次に設定 > アクセス権限 > 実行ロール > ロール名 > 許可ポリシー > 許可を追加 > ポリシーをアタッチで、「AmazonS3FullAccess」を選択しました。
このポリシーをアタッチすることでLambda関数からS3にファイルをアップロードすることができるようになります。
以下のようにLambda関数のコードを書きました。
lambda_function.rb
# AWS Lambda関数で実行するRubyスクリプト
# HTTPクライアントライブラリをインクルード
require 'net/http'
require 'json'
require 'aws-sdk-s3'
# サンプルとしてqiitaのapiを使います
API_URL = "https://qiita.com/api/v2/items?page=1&per_page=1"
BUCKET_NAME = 'dummy-bucket'
KEY_NAME = 'response.json'
# Lambda関数のハンドラー
def lambda_handler(event:, context:)
# HTTPリクエストを送信
res = Net::HTTP.get_response(URI.parse(API_URL))
# HTTPステータスコードが200番台の場合
if res.kind_of?(Net::HTTPSuccess)
# S3クライアントを作成
s3 = Aws::S3::Client.new(region: 'ap-northeast-1')
# S3にデータを書き込み
s3.put_object(
bucket: BUCKET_NAME,
key: KEY_NAME,
body: res.body
)
end
# ステータスコードを返す
return { statusCode: res.code }
end
ここまで実装してテストを実行すると成功しました。S3のバケットにresponse.json
がアップロードされていることが確認できました。
Discussion