🌍
久しぶりにAPI Gateway + Lambda + S3の構成を組もうとしたら色々変わってた
前置き
2から3年ぶりくらいだと思いますが、色々変わってました。
実験段階のモバイルアプリなどで、とりあえずで必要になりそうな構成かなと思います。
AWS Lambda オーソライザー
HTTP API へのアクセスを制御する仕組みのようです。
今回はこれで簡易的にアクセス制御してみようかと思いました。
下記のREST APIの方のドキュメントを見るとハマるので要注意です。
Lambda オーソライザーのペイロード形式バージョンが1.0が「REST API」と互換性があるもののようです。
↓のオーソライザーの設定で、「ペイロード形式のバージョン」を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というのが、見慣れない感じがしました。
ドキュメントは下記です。
終わりに
nodeだとコードのサンプルが若干検索しづらい気がしました。LambdaはPythonの方が人気なのかもしれないです。
Discussion