AWS SAMの「AutoPublishAlias」の使い方を誤るとエイリアス消えちゃうよっていう話

AWS Serverless Application Model(SAM)には「AutoPublishAlias」という設定があります。
docs.aws.amazon.com

- AutoPublishAlias: By adding this property and specifying an alias name, AWS SAM:
  - Detects when new code is being deployed, based on changes to the Lambda function's Amazon S3 URI.
  - Creates and publishes an updated version of that function with the latest code.
  - Creates an alias with a name that you provide (unless an alias already exists), and points to the updated version of the Lambda function. Function invocations should use the alias qualifier to take advantage of this. If you aren't familiar with Lambda function versioning and aliases, see AWS Lambda Function Versioning and Aliases .

AutoPublishAliasを有効にした場合、
Lambdaファンクションのソースコードに変更があった場合はリパッケージされた
Lambdaのバージョンが発行され、指定したエイリアス名とバージョンが紐づくように設定されます。

今回、この「AutoPublishAlias」を利用して、
Lambdaのエイリアスを複数管理しようとしてうまくいきませんでした。
何故うまくいかなかったのか、「AutoPublishAlias」の挙動結果を述べつつ下記に記します。

エイリアス名を変更した時は、変更前に指定したエイリアスが消える

下記の画像のように「dev」が指定されているとします。
これを、「prod」に変更してデプロイしてみます。
f:id:yasay:20181213163719p:plain

すると、「dev」エイリアスが消えて、「prod」エイリアスのみが残りました。
「dev」エイリアスが削除されてしまったんです。
f:id:yasay:20181213163807p:plain

「AutoPublishAlias」をコメントアウトすると、変更前に指定したエイリアスが消える

例えば、下記の画像のようにエイリアス指定をコメントアウトすると・・
f:id:yasay:20181203165003p:plain

エイリアスが消えてしまいます。
f:id:yasay:20181213165309p:plain

絶対消しちゃダメなエイリアスをSAMで指定するのは不安かもしれない

私はAlexaカスタムスキルで利用するエンドポイントにLambdaのエイリアスを利用しています。
例えばAuboPublishAliasで「Prod」が指定されている状況から「dev」に切り替えた時に、
想定外の処理がAlexaカスタムスキルで実行されることになります。

つまり・・私のエイリアスの使い方・・間違っている?
f:id:yasay:20181213154441p:plain

一つのLambdaファンクションにおいて、エイリアスを指定して開発や本番を指定したい時はどうするべきか

消えちゃいけないエイリアス(prodなど)は個別にエイリアスを発行。
それ以外は$LATESTを参照すればよいと思います。

つまり・・私の運用では「AutoPublishAlias」の設定は不要ということです。

・・・じゃぁ、そもそもAutoPublishAliasってどこで使うの?

API Gatewayなどで指定されているLambdaエンドポイントに
エイリアスが指定されている状況において、SAMテンプレートの更新と同期する形で、
エイリアスとバージョンの紐づけを付け替えたい状況
ですかね。

今の私のAlexaカスタムスキルのように
一つのLambdaファンクションで環境を分ける用途になりますと、
最新のバージョンが「prod」エイリアスなどの本番環境に適用されちゃいけないんです。
つまり、私の利用ケースには適さないということですね。

もちろん、一つのLambdaファンクションで開発や本番を定義するという私の考え自体が、
ベスト・プラクティスに則ってない可能性は否定できません。

しかしながら、APIゲートウェイにステージという概念があるように、
Lambdaにもステージという概念があってもいいと思うんですよ。

それを実現するためにエイリアスと「AutoPublishAlias」を活用しようとしていました。

今回の調査により、「AutoPublishAlias」も結局のところ適材適所のパラメータなのだと思いました。
いいアウトプットにはなりました!

以上です!