AWS Lambda のバージョン管理の仕組み

2016.01.27

はじめに

この記事では、AWS Lambdaにおけるバージョン管理についての概要についてまとめています。

バージョン管理というと、SubversionやGitなどのバージョン管理システムが思いつきますが、AWS Lambdaもそのサービスの中で、シンプルなバージョン管理機能を提供しています。

AWS Lambdaにおけるバージョン管理は、主にソースコードの過去バージョンの保管と、開発フローにおける各段階(開発、βテスト、本番稼動)に合わせた過去コードの利用のために用いられます。

バージョニングは基本的には直線の形で更新されていき、過去のバージョンについてはエイリアスという機能を使って別名を与えることができます。

lambda_versioning_01

このエイリアスを用いて、開発フローに合わせて一つのスクリプトのバージョンを切り替えていくというのが、この機能の主な利用法です。

GitやSubversionのような、チーム開発でのコードのマージについての機能は提供していないので、利用する場合は注意が必要となります。

バージョニングについて

AWS Lambdaはその中の一機能としてバージョニングの機能を持ち、各スクリプトの過去のバージョンを管理することができます。

一度バージョンとして発行されたスクリプトは、インクリメンタルなバージョン番号とともに紐付けられ、内容の変更を受け付けることはできなくなります。

各バージョンのスクリプトにはそれぞれARNが割り当てられます。Lambda関数を示すARNには、修飾ARN(Qualified ARN)非修飾ARN(Unqualified ARN)の二種類があります。

修飾ARN(Qualified ARN)は、ARNの末尾にバージョン情報が付加されたARNで、特定のバージョンのLambda関数をしていしたい場合に用いられます。例えば、下記のARNはバージョン2helloworld関数を示しています。

arn:aws:lambda:aws-region:acct-id:function:helloworld:2

一方で非修飾ARN(Unqualified ARN)は、ARNの末尾にバージョン情報が付加されない形式のARNで、この場合は後述の$LATESTで示されたバージョンの関数を示します。例えば、下記のARNは$LATESThelloworld関数を示しています。

arn:aws:lambda:aws-region:acct-id:function:helloworld

最新のスクリプトは常に$LATESTというバージョンで表現されています。このバージョンは少し特殊で、発行されていない状態のスクリプトに対して紐付いています。。

エイリアスについて

エイリアスはその名の通り、バージョンの別名です。あるバージョンに対してエイリアスを設定することで、バージョン番号以外の名前でバージョンを表現することができるようになります。

バージョンは一度発行された後、そのARNが指し示す内容の変更はできませんが、一方でエイリアスは指し示すバージョンを自由に変更することができるという特徴を持っています。
このため、エイリアスが指し示すスクリプトは様々なバージョンのものに変更可能となっています。

エイリアスを利用すると、開発ワークフローに合わせたバージョンの切り替えが可能となります。
例えば、本番環境用にエイリアスを安定した古いバージョンに設定しておき、ある程度開発やテストが進んだ段階で新しい安定バージョンのものに切り替えるといったことが可能になります。

リソースポリシーとの関連性

プッシュモデルのイベントソースからLambda関数を呼び出す場合、イベントソース側にLambda関数のパーミッション設定を行う必要があります。

例えばS3やDynamoDB,KinesisなどのイベントをトリガとしてLambda関数を実行する場合、それぞれのイベントソースに対して呼び出したい関数のARNを指定し、実行を許可する設定を行います。

Lambda関数のARNは、先に説明した通り、最終的にある特定のバージョンを示すこととなります。このため、例えば非修飾ARN(Unqualified ARN)を指定した場合はその$LATESTのみが、修飾ARN(Qualified ARN)の場合は該当するバージョンまたはエイリアスの関数のみが許可されます。

エイリアスのARNをイベントソースのポリシーとして設定した場合、あくまでエイリアスと同じARNでしか関数にアクセスできなくなる点に注意が必要です。

例えばエイリアスの示すバージョン番号を含んだARNでアクセスしようとしても許可はされません。一方でエイリアスのARNを指定しておけば、対象のバージョンを更新したとしても、設定の変更なくエイリアスが示す関数を利用することができます。

Lambda関数のARNが必要となる場面では、バージョン管理やエイリアスの運用方法も一つ考慮しておいたほうが、後々便利になりと思います。

参考資料