🌍

久しぶりにAPI Gateway + Lambda + S3の構成を組もうとしたら色々変わってた

に公開

前置き

2から3年ぶりくらいだと思いますが、色々変わってました。
実験段階のモバイルアプリなどで、とりあえずで必要になりそうな構成かなと思います。

AWS Lambda オーソライザー

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-lambda-authorizer.html

HTTP API へのアクセスを制御する仕組みのようです。
今回はこれで簡易的にアクセス制御してみようかと思いました。

下記のREST APIの方のドキュメントを見るとハマるので要注意です。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html#api-gateway-lambda-authorizer-request-lambda-function-create

Lambda オーソライザーのペイロード形式バージョンが1.0が「REST API」と互換性があるもののようです。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-lambda-authorizer.html#http-api-lambda-authorizer.payload-format

↓のオーソライザーの設定で、「ペイロード形式のバージョン」を2.0に設定したのに、1.0のドキュメントを見ながら設定すると動作しないので、注意が必要です。

2.0だとオーソライザーのコード(Node.js)は、↓のような感じで良さそうです。
1.0の時と比べて、ずいぶん簡略化されました。
(動作未確認)

export const handler = async(event) => {
  let response = {
      "isAuthorized": false,
  };
  
  if (event.headers.authorization === "secretToken") {
      console.log("allowed");
      response = {
          "isAuthorized": true,
      };
  }

  return response;
}

※ 実際のコードでは、secretTokenの部分は、DBなどに問い合わせる

CloudWatchのログは、このあと実装する、Lambdaとは別のところ(オーソライザー専用のところ)に出力されます。

S3にファイルアップロード

ざっとこんな感じのコードになるようです。

import {
  S3Client,
  PutObjectCommand,
} from "@aws-sdk/client-s3";

export const handler = async (event) => {
  // 簡易的ですが、クエリパラメータでファイル名を取るようにしてます。
  const filename = event.queryStringParameters.filename;

  const client = new S3Client({});

  let requestBody = Buffer.from(event.body, 'base64');

  const input = {
    Body: requestBody,
    Bucket: 'watanabe-sample', 
    ContentType: 'image/png', // 今回は画像を想定してます。
    Key: filename
  };

  const command = new PutObjectCommand(input);
  const responsePutObject = await client.send(command);

  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};

PutObjectCommandというのが、見慣れない感じがしました。
ドキュメントは下記です。
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/command/PutObjectCommand/

終わりに

nodeだとコードのサンプルが若干検索しづらい気がしました。LambdaはPythonの方が人気なのかもしれないです。

しくみのテックブログ

Discussion