📄

LambdaでAPIにリクエストして取得したレスポンスをS3にアップロードする

2022/12/11に公開

やりたいこと

業務で運用している自社サイトの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