LANG SELRCT

コードを書く場所

2019年3月4日月曜日

AWS Lambda+APIGatewayで本番環境と開発環境を分けたい


アプリケーションやサービスを開発していると、「運用している本番環境のコード」と、「修正を試みる開発環境のコード」を別々に管理したくなると思います。


Lambdaでどうやったらいいか調べてみると「バージョン」と「エイリアス」という概念があることを知りましたが、リファレンスを見ても文章だけではいまいちよくわからず、いろいろ試してたどり着いた方法を書き残します。


AWS側の仕様がどの程度の頻度で変わるのかわかりませんが、2019/03/04 現在試して実現した方法です。


API Gatewayのステージについてはここでは触れません。


今回試してステップ化した手順はこんな感じです
  1. Lambda Functionを作る
  2. API Gatewayを作る
  3. $LATESTをバージョン1として保存する
  4. 本番用のエイリアスを作成してバージョンをバージョン1にする
  5. 本番用のエイリアスにAPI Gatewayを作る
  6. $LATESTのコードを編集する
  7. $LATESTをバージョン2として保存する
  8. 本番用のエイリアスのバージョンをバージョン2にする
    以降も $LATEST を編集してバージョンを上げ、本番のエイリアスに紐付けていく
こう書いてみると当たり前に見えますが、これを導くのに結構な時間がかかりました。
その過程を以下に書いていきます。


1. Lambda Functionを作る
2. API Gatewayを作る

作ったことがない場合は、以前書いた
AWS LambdaとAPI Gatewayを使ってみるで作れると思います


3. $LATESTをバージョン1として保存する

($LATEST は現在編集している最新の状態という理解で進めます)

作成したFunctionの「Actions」をクリックして「Publish new version」を選択します


Version discriptionにこのバージョンの説明を入力して「Publish」をクリックします


Version: 1が作成されてこのような画面になります


4. 本番用のエイリアスを作成してバージョンをバージョン1にする

「Actions」から「Create alias」を選択します


本番用の「Name」と「Description」を入力して
「Version」を 1 にして「Create」をクリックします


これで本番環境の prod と バージョン1が紐付きました!


…が、何と何がどう紐付いたのかいまいち見えてこない、、

エイリアスとバージョンの概念がよくわからないのでエイリアスのリファレンスを見てみよう。
Lambda 関数の 1 つ以上のエイリアスを作成できます。AWS Lambda エイリアスは Lambda 関数の特定のバージョンに対するポインタのようなものです。
ふむふむ、なるほど、ポインタって何だろう?

日本語に訳しきれない表現かもしれないので、英語で見てみよう。
https://docs.aws.amazon.com/lambda/latest/dg/aliases-intro.html
You can create one or more aliases for your Lambda function. An AWS Lambda alias is like a pointer to a specific Lambda function version. 
完璧なほどに翻訳されている。なので、やっぱりよくわからない。


よくわからないので初期状態の「バージョン」と「エイリアス」がどうなっているか別のFunctionを作って確認してみよう。

Lambda Functionを作成した初期状態でQualifiersを開くと
Aliasesが選択されて Version: $LATESTとなっている


Versionsを選択すると$LATESTだけがある


$LATEST は開発環境として使って、開発後に運用するコードは都度バージョンを保存して、本番環境に反映させれば良いのかな、とイメージが浮かんできた。

本番環境のAPI Gatewayのendpointは、バージョンを上げる度に変更するわけにはいかないので、Aliasesの方の「prod」に作れば固定できそう。
Versionsの方でAPI Gatewayを作成すると、そのバージョンのLambda Functionを動かすendpointが作れるのか。
(この辺がちょっと混乱して紐解くのに時間かかった)

このあたりまで来て「バージョン」と「エイリアス」の関係がちょっとわかってきました。(本当にわかっているかどうかは別として)

ちなみに、API KEYを設定する場合、この方法では本番用にアクセスするとforbiddenが返ってきました。
(このあたりの仕組みをまだ理解できていない)
その回避策


5. 本番用のエイリアスにAPI Gatewayを作る

1, 2と同じく、AWS LambdaとAPI Gatewayを使ってみると同じ手順で、Aliasesの prod にAPI Gatewayを作成します。


6. $LATESTのコードを編集する
(バージョンを上げてそれを本番環境に反映してみる)

デフォルトで入っている body: JSON.stringify('Hello from Lambda!') に V2 を追加して「Save」します



index.js
exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!V2'),
    };
    return response;
};


7. $LATESTをバージョン2として保存(Publish)する

3. と同じ手順でバージョンを保存します


8. 本番用のエイリアス(prod)のバージョンをバージョン2にする

Aliasesの prod を選択して

Version を 2 にして「Save」をクリックします
これで、Aliases prod の API Gateway の endpoint にアクセスすると

"Hello from Lambda!V2"

とバージョン2の Lambda Function が実行されて結果が返ってきました。


以上


参考

AWS Lambda バージョニングの紹介
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/versioning-intro.html

AWS Lambda エイリアスの紹介
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/aliases-intro.html

AWS Lambda 関数のバージョニングとエイリアス
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/versioning-aliases.html