Lambda Functionのバージョン・エイリアス運用方針 #アドカレ2015

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

丹内です。

掲題の通り、モバイルのバックエンドとしても期待されているAWS Lambdaを継続的に使う際に欠かせない、リリース周りについて考えてみます。

概要の説明

先日の勉強会での発表でLambdaをProduction環境にデプロイした例をお話しました。
しかしながら実務では「デプロイしたらそれっきり」というものは少なく、ビジネスやスケールの変化に伴いコードにも変更が発生します。 日々発生する変更を安全にデプロイし、問題があったらすぐロールバックできるということが、継続的なソフトウェア開発には必要です。 Lambda Functionにはバージョニングとエイリアスという機能が、これを使うことで、Blue-Green Deploymentのようにデプロイやロールバックが可能になります。

以下の図をご覧ください。

Lambda Functionの運用方針

この図は、バージョニングとエイリアスを使った場合のデプロイ例を示しています。
LambdaのSimple Iconの下の丸は、コミットグラフを表しています。その右側に緑色でバージョンを、左側に赤色でエイリアスを併記しています。また、下部には本番(Production)にデプロイされているコミットのFunction/Version/AliasそれぞれのARNを示しています。 この運用の場合、イベントソースのARNには一番下のエイリアス付きのものを指定します。そうすることで、エイリアスを張り替えるだけで自動的に実行されるコードも追従して変化します。
上の図で本番環境のFunctionのバージョンを進める場合、productionエイリアスをバージョン2に張り替えます。 その後問題が発生してロールバックしたい場合は、productionエイリアスをバージョン1に張り替えます。

実際の手順

この設定を実際に行ってみます。今回のイベントソースはS3 Object Created(Put)です。
また、Lambda Functionは作成済みであるとします。作成直後のLambda Functionにはエイリアスが無く、$LATESTバージョンのみがあります。

バージョンをPublishする

まずはバージョンをPublishします。マネジメントコンソールでは以下の箇所をクリックします。

lambda1

出てくるフォームにバージョンを識別できる文言を入力し、submitします。これでバージョンが発行されます。

lambda2

なお、発行されるバージョン自体は、ユーザが指定することはできません。シーケンシャルな整数が割り当てられるようです。

Publishしたバージョンに対してエイリアスを作成する

次にエイリアスを作成し、先ほど発行したバージョンを設定します。

lambda3

出てくるフォームに、以下のように入力してsubmitします。ここで選択したVersionに対してエイリアスが発行されます。今回は1を選びます。

lambda6

これでエイリアスが発行され、それにバージョン1が設定されます。以下の画像のようになるはずです。

lambda5

S3のObject Created(Put)をイベントソースに設定する

S3にオブジェクトをputしたらFunctionが起動するようにイベントソースを設定します。
ここらへんからLambdaのUIが分かりにくくなるのですが、以下のように選択していってAdd Event Sourceをクリックします。

lambda11

出てくるフォームに、適切に入力してsubmitします。ちなみにこの時prefixとsuffixを設定することができ、該当したObject CreatedのみでFunctionが起動するように設定できます。1つのバケットに複数のLambda Functionを設定して使い分ける(ファンアウト)パターンで便利です。

lambda4

これで、S3に対してLambda Functionを設定できます。以下のように、S3のバケット画面で確認できます。(以下の画面では別なFunctionを設定済みであるため、Functionが2つになっています。)

lambda8

修正したコードでFunctionを更新する

Nodejs sdkで言うところのupdateFunctionCode()です。
コードを更新すると$LATESTバージョンのコードが更新されます。 なお関連して、バージョンには以下の制約があります。

  • 直前のバージョンと全く同じコードではバージョンをPublishできない(zipファイルの場合も同様)
  • PublishしたFunctionのコードは変更できない

次のバージョンをPublishする

バージョン1からの変更が加えられた$LATESTに対して、次のバージョンを発行します。 操作は前回と同様なので省略します。
操作後は画像のようになっています。この段階ではバージョン12が発行され、バージョン1productionエイリアスが設定されています。したがって、S3 Object Createdで実行されるのは現段階ではバージョン1です。

lambda9

次のバージョンにエイリアスを貼り替える

ここまでくると、エイリアスのConfigurationタブで新たにバージョン2を選択できるようになっているので、選択します。

lambda10

これで完了です!
何かあったらエイリアスをバージョン1に戻すことで、安全にロールバックできます。

まとめ

AWS Lambdaのエイリアスとバージョニング機能を使った、具体的なデプロイとロールバックについての運用方針をご紹介しました。
これを支援するライブラリは、AWS公式のJAWS Framework以外にもたくさんあるようです。
皆さんの環境に合わせた適切な運用の参考になれば幸いです。

明日は橋本さんのAndroidとMobule Hubを一通り簡単に使ったアプリを作ってみるです。お楽しみに!