Amazon S3 バケットを作成する
処理結果のファイルを格納するために、Amazon S3にバケットを作成します。
バケットとはデータを保存するための基本的なコンテナです。
マネジメントコンソールからS3のサービスを探します。
メニューから「バケット」ページへ移動し、「バケットの作成」をクリックします。
バケット名を入力します。
ここでは「prd-sh-point-cloud」としています。
「このバケットのブロックパブリックアクセス設定」の「パブリックアクセスをすべてブロック」のチェックを外し、「パブリックアクセスのブロックをすべてオフにすると、このバケットとバケット内のオブジェクトが公開される可能性があります。」のチェックを入れます。
「バケットを作成」をクリックします。
バケットが作成され準備ができました。
作成されたバケット名をクリックします。
「アクセス許可」をクリックします。
バケットポリシーの「編集」をクリックします。
バケットポリシーの編集画面に遷移します。
ポリシーに以下を入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::prd-sh-point-cloud/*"
}
]
}
「変更の保存」をクリックします。
バケットポリシーが保存されました。
以上でS3の準備は完了です。
Lambdaを作成する
マネジメントコンソールからLambdaのサービスを探します。
Lambdaのダッシュボードページで「関数の作成」をクリックします。
関数の作成ページで「一から作成」を選択します。
関数名を入力します。ここでは「s3-presigned-url」としています。
ランタイムはNode.js 20.xを選択します。
実行ロールは「基本的な Lambda アクセス権限で新しいロールを作成」を選択します。
「関数の作成」をクリックします。
関数が作成され、関数のページに遷移しました。
「コード」タブのコードソースを以下に変更します。
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
import {
getSignedUrl,
} from "@aws-sdk/s3-request-presigner";
export const handler = async (event, context) = {
let body;
let statusCode = 200;
const headers = {
"Content-Type": "application/json",
};
try {
switch (event.routeKey) {
case "POST /s3-presigned-url":
let requestJSON = JSON.parse(event.body);
const client = new S3Client({ region: "ap-northeast-1" });
const command = new PutObjectCommand({ Bucket: "prd-sh-point-cloud", Key: requestJSON.name });
const signedUrl = await getSignedUrl(client, command, { expiresIn: 3600 });
body = {signedUrl: signedUrl
};
break;
default:
throw new Error(`Unsupported route: "${event.routeKey}"`);
}
} catch (err) {
statusCode = 400;
body = err.message;
} finally {
body = JSON.stringify(body);
}
return {
statusCode,
body,
headers,
};
};
「Bucket: "prd-sh-point-cloud"」には作成したS3のバケット名を入力します。
「Deploy」をクリックします。関数が更新されます。
設定→アクセス制限の順にクリックします。
実行ロールのロール名に表示されているリンクをクリックします。
Identity and Access Management (IAM)のロールページに遷移します。
許可ポリシーの「許可を追加」をクリックし「ポリシーをアタッチ」を選択します。
その他の許可ポリシーの検索フォームに「S3」と入力します。
ポリシー名「AmazonS3FullAccess」の左のチェックを入れ「許可を追加」をクリックします。
ポリシーがロールにアタッチされました。
許可ポリシーに「AmazonS3FullAccess」が含まれています。
これで、Lambdaの作成は完了となります。
API Gatewayを作成する
マネジメントコンソールからAPI Gatewayのサービスを探します。
API Gatewayのページへ移動し、「APIを作成」をクリックします。
APIタイプを選択では、「HTTP API」を選択し、「構築」をクリックします。
「REST API を作成」の画面に遷移します。
API名を入力します。ここでは「s3-presigned-url」としています。
「確認して作成」をクリックします。
「作成」をクリックします。
APIが作成されルートページに遷移します。
ルートの「作成」をクリックします。
「ルートの作成」の画面に遷移します。
左側の「メソッド」はPOSTを選択し、右側のパスは「/s3-presigned-url」と入力します。
「作成」をクリックします。
ルートが追加されました。
「POST」を選択し「統合をアタッチする」をクリックします。
「統合を作成してアタッチ」をクリックします。
統合タイプは「Lambda関数」を選択します。
統合の詳細でLambda関数の選択ができるようになるので、
作成したLambda関数「s3-presigned-url」を指定します。
「作成」をクリックします
統合ページに遷移します。
メニューのStagesからステージページに遷移します。
「s3-presigned-url のステージ」の「$default」を選択します。
ステージの詳細の「URL を呼び出す」に表示されているURLがAPIのURLになります。
APIの動作確認をします。
お使いのパソコンのコンソールからcurlコマンドで確認してみます。
「-d」で指定しているのはPOSTリクエストのJSONです。
curl -X POST -H 'Content-Type: application/json' -d '{"name":"sample.png"}' https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/s3-presigned-url
以下のようなレスポンスが返ってきたら成功です。
{"signedUrl":"https://prd-sh-point-cloud.s3.ap-northeast-1.amazonaws.com/sample.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIA52CRWIVMQRWTMXHQ%2F20240322%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Date=20240322T195501Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEDQaDmFwLW5vcnRoZWFzdC0xIkYwRAIgOEsEm7gphZoOc5Db9AT4enVCHiCOmJTrhfBqJFFIDAICIBQX%2FwhJPtyrhssDdJgi%2B99v0BHV2faK0CIAEyMqXliKKvkCCE0QABoMOTQ5MzU5MTAxMjczIgzLbiPuRk8aIY3B4oEq1gJd1djurLn9%2BE1sa7%2Bk79u7lAghCg7JvTV4QeDiEDh8L1bwEGZ%2BK0J7j4cdCiqJry0C8O7L6edgHedctGoSbOKdlBD8IW3s6aCI%2F%2BwyRAVhCCYOYQJRRu6tlv73Q63ep694FEkWmGpDIBLLxnI%2Fu4TZxDjpXJC6Os%2FVdkXakckYh4M7K5DAz%2FA%2FIaJSHXvIw2swIs5A9jHlGih2erNO7OVf30p9S16XiO%2BdX7JjhnV23cc9O8ypUMNwIr3Jv453%2FxIL%2B9%2BXOQDXKO3XMH1LlVHjK8PwmuIsWFG6GtPKOm5uDvy77Cgs7KfVKQAD05Z9p82V91Vm3MJcPMtwAO1716HO%2F4vx2G24WccwzFE8OFx1QNz2OkpousHMKPVATkeG%2FqSnQcyehSRmfgEgE95QB3fntqc8SlN7NpA31CT51DFvxlj3ARGrLjtOPtPsLppy6lD0Fg4cmPUw7cL3rwY6nwEGdSx0geECIqiKAgVdY5taSrHRl4h4VLPrryDelv5WqSGXuBosX28ReLaCeFYRUHnMT80UEkYlTTmYZc4ak4wm1iaVxfkP5eYaUWG19N3jhNs1I7LNebeZaqHYYDfPNNcSzAOQe8cLKXm3laKx5T%2Br2mSFnPrfDYGX3BEwgRY7%2FaMH0REbe9BY40O9m3mEsRyPNDFITfUIuYEihAjpBCs%3D&X-Amz-Signature=cb2b021c8c7ab0d8fc905819e65366adcb74c77b8735d7f658215fa9d953c356&X-Amz-SignedHeaders=host&x-id=PutObject"}%