0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Lambdaのエイリアスとバージョンを試してみた

Posted at

背景・目的

なんとなく知っていましたが、あまり使うことはないLambdaのエイリアスとバージョンについて整理します。

まとめ

下記に特徴をまとめます。

特徴 説明
Lambdaのエイリアスとは ・更新可能な関数のバージョンへのポインタ
・エイリアスは、ARNを使用して関数のバージョンにアクセスできる

・新しいバージョンをデプロイする場合、下記の方法がある
 ・新しいバージョンを使用するようにエイリアスを更新する
 ・2つのバージョン間でトラフィックを分割する
エイリアスの制限事項 別のエイリアスを参照することはできない
エイリアスの仕様 ・エイリアスは、最大2つのLambda関数バージョンを指す事が可能
・両方のバージョンに同様の実行ロールが必要
・同様のDead letter queueを持つか、一切持たない必要がある
・両方のバージョンを公開する必要がある。エイリアスは$LATETを参照することはできない
呼び出されたバージョンの確認 ・CloudWatch Logs
・レスポンスヘッダーのx-amz-executed-version

概要

エイリアス

下記を参考に整理します。

Lambda 関数のエイリアスを作成できます。Lambda のエイリアスとは、更新可能な関数のバージョンへのポインタです。関数のユーザーは、エイリアス Amazon リソースネーム (ARN) を使用して関数のバージョンにアクセスできます。新しいバージョンをデプロイする場合は、新しいバージョンを使用するようにエイリアスを更新するか、2 つのバージョン間でトラフィックを分割することができます。

  • 更新可能な関数のバージョンへのポインタ
  • エイリアスは、ARNを使用して関数のバージョンにアクセスできる
  • 新しいバージョンをデプロイする場合、下記の方法がある
    • 新しいバージョンを使用するようにエイリアスを更新する
    • 2つのバージョン間でトラフィックを分割する

イベントソースとアクセス許可ポリシーでの Lambda エイリアスの使用

下記を参考に整理します。

各エイリアスには一意の ARN があります。エイリアスは関数のバージョンのみを参照でき、別のエイリアスを参照することはできません。関数の新しいバージョンを指すよう、エイリアスを更新できます。

  • 別のエイリアスを参照することはできない

Lambda エイリアスのルーティング設定を作成する

下記を参考に整理します。

エイリアスのルーティング設定を使用して、トラフィックの一部を 2 番目の関数バージョンに送信します。たとえば、エイリアスを設定して、ほとんどのトラフィックを既存のバージョンに送信し、トラフィックの一部を新しいバージョンに送信するように設定することで、新しいバージョンを展開するリスクを軽減できます。

  • トラフィックの一部を2番目の関数に送信できる
  • 既存のバージョンと新しいバージョンにわけることができる

Lambda は、単純な確率モデルを使用して 2 つの関数バージョン間でトラフィックを分散します。低いトラフィックレベルでは、各バージョンで設定されたトラフィックの割合と実際の割合の間に大きな差異が生じる場合があります。関数がプロビジョニングされた同時実行を使用する場合、エイリアスルーティングがアクティブである間に、プロビジョニングされた同時実行インスタンスの数を高く設定することで、過剰呼び出しを防ぐことができます。

  • Provisioned Concurrencyは、エイリアスにも設定できる

エイリアスは最大 2 つの Lambda 関数バージョンを指すことができます。バージョンは次の基準を満たす必要があります。

  • 両方のバージョンに同じ実行ロールが必要です。
  • どちらのバージョンも、同じ配信不能キュー設定を持つか、配信不能キュー設定がない必要があります。
  • 両方のバージョンを公開する必要があります。エイリアスが $LATEST を指すことはできません。
  • エイリアスは、最大2つのLambda関数バージョンを指す事が可能
  • 両方のバージョンに同様の実行ロールが必要
  • 同様のDead letter queueを持つか、一切持たない必要がある
  • 両方のバージョンを公開する必要がある。エイリアスは$LATETを参照することはできない

呼び出されたバージョンの特定

どちらのバージョンが呼び出されたかを特定するには、下記の方法があります。

  • CloudWatch Logs
    • STARTログエントリをLambdaが自動的に発信する
  • レスポンスのペイロードで、呼び出された関数のバージョンを示すx-amz-executed-versionがヘッダーに含まれる

バージョン

下記を参考に整理します。

バージョンを使用して、関数のデプロイを管理できます。たとえば、安定した実稼働バージョンのユーザーに影響を与えることなく、ベータテスト用の新しいバージョンの関数を公開できます。Lambda は、関数を公開するたびに新しいバージョンの関数を作成します。新しいバージョンは、関数の未公開バージョンのコピーです。未公開バージョンの名前は $LATEST です。

  • バージョンを使用して、関数のデプロイを管理できる
  • 例)βテスト用の新しいバージョンを公開できる

実践

バージョンとエイリアスの確認

下記を参考に試します。

Lambda 関数の作成

  1. Lambdaに移動します
  2. 「関数の作成」をクリックします
  3. 下記を入力し、「関数の作成」をクリックします
    • MyLambdaFunction
    • ランタイム:Python3.13
  4. 下記のコードをアップロードします(「Deploy」します)
    import json
    
    def lambda_handler(event, context):
        # TODO implement
        return {
            'statusCode': 200,
            'body': json.dumps('Hello from version 1')
        }
    
  5. 「Test」をクリックし、動作を確認します。想定した結果が返されました
    Status: Succeeded
    Test Event Name: (unsaved) test event
    
    Response:
    {
      "statusCode": 200,
      "body": "\"Hello from version 1\""
    }
    

バージョンの発行

  1. ①「バージョン」タブ、②「新しいバージョンを発行」をクリックします
    image.png

  2. ポップアップが表示されるので、説明を書いて「発行」をクリックします
    image.png

エイリアスの作成

  1. ①「エイリアス」タブ、②「エイリアスを作成」をクリックします
    image.png

  2. 下記を入力し、「保存」をクリックします

    • 名前:任意(ここではprd)
    • バージョン:1
      image.png
  3. エイリアスの画面で「テスト」タブをクリックし、「テスト」をクリックします。想定通りの結果が返されました

    {
      "statusCode": 200,
      "body": "\"Hello from version 1\""
    }
    

コードの更新と新バージョンの発行

  1. 下記のようにコードを修正し、「Deploy」をクリックします

    import json
    
    def lambda_handler(event, context):
        # TODO implement
        return {
            'statusCode': 200,
            'body': json.dumps('Hello from version 2')
        }
    
  2. テストを実行します。想定通りの結果が返されました

    {
      "statusCode": 200,
      "body": "\"Hello from version 2\""
    }
    
  3. 「バージョン」タブをクリックします

  4. 「新しいバージョンを発行」をクリックします

  5. 2つのバージョンが作成されました
    image.png

エイリアスの更新

  1. ①「エイリアス」タブ、先ほど作成した②エイリアス「prd」をクリックします
    image.png
  2. 「編集」をクリックします
  3. バージョンを「2」に変更し、「保存」をクリックします
    image.png

動作確認

  1. 「テスト」タブをクリックし、「テスト」を実行します。切り替わりました
    {
      "statusCode": 200,
      "body": "\"Hello from version 2\""
    }
    

ルーティングの確認

下記を基に試します。

エイリアスの設定

現在、エイリアスで参照しているバージョン「2」に対して、あらたに「1」を設定します。

  1. 「エイリアス」タブ、エイリアス名「prd」をクリックします
  2. 「編集」をクリックします
  3. 下記を入力し、「保存」をクリックします
    • ①:追加のバージョン:1
    • ②:重み:20%
      image.png

動作確認

  1. 何回か「テスト」をクリックします。ランダムに1が表示されました

    {
      "statusCode": 200,
      "body": "\"Hello from version 1\""
    }
    
    {
      "statusCode": 200,
      "body": "\"Hello from version 2\""
    }
    
  2. CloudWatch Logsに移動します

  3. バージョンごとにログストリームが作成されるようです
    image.png

  4. バージョン1の結果は下記のとおりです
    image.png

  5. バージョン2の結果は下記のとおりです
    image.png

考察

今回、Lambdaのエイリアスとバージョンについて簡単に整理し、動作確認を行いました。
これらを適切に活用することで、Blue/GreenデプロイやCanaryデプロイを効率的に実現できると感じました。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?