Lambda + API Gateway入門。画像のDL

前回、前々回でLambda + API GatewayREST APICSVのダウンロード、CORSの対応を紹介してきました。
今回は画像や動画、ZIPファイル等のバイナリファイルをダウンロードする方法を紹介します。

前回、前々回のLambdaを使いまわしますので、先にそちらを参照してください。

xp-cloud.jp

xp-cloud.jp

 

全体的な流れは次のようになります

 

Lambda + API Gateway入門 全体的な流れ

 

図を見ていただくと分かりますが、今回はAPI Gatewayを少し変更します。

 

画像ファイルの用意

今回はS3 へ画像ファイルを用意しました。

 

S3 へ画像ファイルを用意

 

この画像をAPI Gateway、Lambdaを経由してダウンロードさせたいと思います。

 

Lambdaの用意

Lambdaを次のように変更してください

 

var AWS = require('aws-sdk');
var s3 = new AWS.S3();

exports.handler = async (event) => {
    var data = await getS3Object();
    return data.Body.toString('base64');
};

const getS3Object = () => {
    return new Promise((resolve) => {
        var params = {
            Bucket: "<S3のバケット名>",
            Key: "<S3のフォルダ>/xpcloud_icon.png"
        };
        s3.getObject(params, function(err, data) {
            resolve(data);
        });
    });
};

 

var AWS = require('aws-sdk');

この行でS3から取得するためにAWS SDKを読み込んでいます。
Lambdaではデフォルトでライブラリがインストールされているため"require"と書くだけで使用することができます。
さらにLambdaに割り当てたロールで実行されるためACCESS_KEY等の認証情報も不要です。

getS3Object

このメソッドでS3からファイルを取得しています。
今回はファイル名を決め打ちで記載しましたが、event変数の中にURLパラメータが入っているので、ファイル名を動的にすることも可能です。

return data.Body.toString('base64');

この行で画像ファイルを文字列へ変換してLambdaを終了しています。

 

API Gatewayの用意

API Gateway を開きます。

 

API Gateway を開く

 

統合リクエストを開きます。

 

API Gateway統合リクエストを開く

 

前回作成したAPI Gatewayのままだと"Lambdaプロキシ統合の使用"にチェックが入っていると思いますので、外します。
これを外すことで上の図の右下"統合レスポンス"を変更することができるようになります。

 

API Gateway 統合レスポンスを変更

 

"メソッドの実行"を押して戻り、次はメソッドレスポンスを変更します。

 

メソッドレスポンスを変更

 

HTTP200のレスポンスに設定を足します。
200のレスポンスヘッダーに"Content-Type"(大文字小文字もしっかり)、
200のレスポンス本文に"image/png"/"Empty"を設定します。
"Empty"という名前が紛らわしいですが、オブジェクトをそのまま渡すというモデルになってます。

 

レスポンスに設定

 

このあたりの設定値の意味は全部設定した後で説明します。
"メソッドの実行"で戻り、次は統合レスポンスを開きます。

 

メソッドの実行で戻る

 

メソッドレスポンスのステータス200の項目が最初からあると思いますので、開いて編集します。
コンテンツの処理を"バイナリに変換"、
Content-Type(上で設定した物です)のマッピングの値に「'*'」(シングルクォート、アスタリスク、シングルクォートの3文字)を設定して保存します。

 

メソッドの実行

 

メソッドの実行で戻ると、このような設定になっていると思います。

 

 

アクション>APIのデプロイ を選択します。

 

APIのデプロイ

 

ステージはすでに作成されているはずなので、それを選べばOKです。
デプロイを押すとAPI Gatewayの設定が反映されます。

 

 

ではURLを開いてみましょう。
前回作成したURLと同じです。

 

URLを開く

 

画像が表示されれば成功です。
もしどこかで設定を間違い、修正しても画像が上手く表示されない場合は、何度かF5でリロードしてみてください。
キャッシュが残っていて表示されない場合があります。

 

画像表示

 

色々設定しましたが、全体的な流れを解説します。

 

Lambda + API Gateway入門 画像のDL 全体の流れ

 

あとがき

Content-Typeを変更するとMP3やMP4にも対応できるため、WEBで使う機能は一通り網羅できたと思います。
Lambdaを通しているため認証をからめたり複雑な処理も可能です。

 

 

 

AWS相談会