AWS CDKでLambdaバージョンとエイリアスをしてみた。

2022.03.12

概要

Lambdaバージョン

  • Lambdaバージョンは、関数のデプロイを管理するために使用できます。
  • Lambda は、関数を公開するたびに新しいバージョンの関数を作成します。
  • 新しいバージョンを作成する前に、$LATEST でコードの変更をデプロイする必要があります。
  • バージョンは不変です。
  • バージョンは独自のARNを取得します。

 

Lambdaエイリアス

  • エイリアスはラムダバージョンへのポインタです。
  • エイリアスは変更可能です。
  • エイリアスは関数のバージョンのみを参照でき、別のエイリアスを参照することはできません。
  • 関数の新しいバージョンを指すよう、エイリアスを更新できます。

 

この記事では、AWS CDKでLambdaバージョンとエイリアスをしてみました。

 

やってみた

 

CDKアプリの作成

  • 次のコマンドを使用してCDKをインストールしておきます。
npm install aws-cdk-lib

 

  • 新しいディレクトリを作成しておきます。
  • CDKは、プロジェクトディレクトリの名前に基づいてソースファイルとクラスに名前を付けます。
#create new directory
mkdir lambda-versioning
cd lambda-versioning

 

  • cdk initコマンドを使用してアプリを初期化しておきます。
cdk init --language typescript

 

Lambda関数の作成

  • プロジェクトのメインディレクトリにresourcesディレクトリを作成しておきます。
mkdir resources

 

  • resourcesディレクトリに次のPythonファイルを作成しておきます。[resources/lambda-handler.py]

 

def handler(event, context):
    statusCode = 200
    body = "Hello from $Latest version" 
    response = {
        'statusCode': statusCode,
        'body': body,
        'headers': {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
            }
    }
    return response

 

  • 新しいファイル [lib/index.ts] を作成して、作成する必要のあるAWSサービスを定義しておきます。
  • [index.ts]ファイルでLambda関数を定義して、$Latestバージョンで [dev]エイリアスを定義しておきます。

 

const lambdaFunction = new Function(this, "Lambda-Versioning", {
      code: new AssetCode("resources"),
      handler: "lambda-handler.handler",
      runtime: Runtime.PYTHON_3_9,
      functionName: "Lambda-Versioning",
    });

const LatestVersion = lambdaFunction.latestVersion;
const DevAlias = new Alias(this, 'dev-alias', {
            aliasName: 'dev',
            version: LatestVersion
        });

 

  • /lib/api_stack.ts ファイルに次のコードを追加しておきます。
import * as version from '../lib/index';
new version.versioningStack(this, 'lambda-versioning' );

 

  • 次のコマンドを使用してCDKを展開しておきます。
cdk deploy

 

  • コンソールでは、$Latestバージョンの「dev」エイリアスを確認できます。

 

関数バージョンとエイリアスの作成

 

バージョン1と[prd]エイリアスの作成

  • 新しいバージョンを作成する前に、ラムダコードにいくつかの変更をしておきます。

 

def handler(event, context):
    statusCode = 200
    body = "Hello from version V1" 
    response = {
        'statusCode': statusCode,
        'body': body,
        'headers': {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
            }
    }
    return response

 

  • [index.ts]ファイルで新しいバージョン[V1]とこのバージョンのエイリアス「prd」を定義しておきます。
#create new version v1
const LambdaVersionV1 = new Version(this, 'version-V1', {
        lambda: lambdaFunction
    });

#create an alias for the version.
const PrdAlias = new Alias(this, 'V1-prd-alias', {
        aliasName: 'prd',
        version: LambdaVersionV1,
    });

 

  • 次のコマンドを使用してCDKを展開しておきます。
cdk deploy

 

  • コンソールで、バージョンとエイリアスが作成されていることを見ることができます。

 

 

バージョン2と[stg]エイリアスの作成

  • バージョン2を作成する前に、ラムダコードにいくつかの変更をしておきます。

 

def handler(event, context):
    statusCode = 200
    body = "Hello from version V2" 
    response = {
        'statusCode': statusCode,
        'body': body,
        'headers': {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
            }
    }
    return response

 

  • [index.ts]ファイルで新しいバージョン[V2]とこのバージョンのエイリアス「stg」を定義しておきます。
#create new version 
const LambdaVersionV2 = new Version(this, 'version-V2', {
        lambda: lambdaFunction
    });

#create an alias for the version.
const StgAlias = new Alias(this, 'V2-stg-alias', {
        aliasName: 'stg',
        version: LambdaVersionV2,
    });

 

  • 次のコマンドを使用してCDKを展開しておきます。
cdk deploy

 

  • コンソールで、バージョンとエイリアスが作成されていることを見ることができます。

 

 

APIの作成

  • エイリアスごとに個別のエンドポイントを持つAPIゲートウェイを作成しておきます。
    • dev alias - $Latest version - /dev/version
    • prd alias - version 1 -  /prod/version
    • stg alias -  version 2  - /stg/version

 

#create api
const api = new RestApi(this, 'api', {
        restApiName: 'version-api',
        deploy: true
      });

#GET method for dev alias
const dev = api.root.addResource('dev');
const devVersion = dev.addResource('version');
devVersion.addMethod('GET', devIntegration);

#GET method for prod alias
const prod = api.root.addResource('prod');
const prodVersion = prod.addResource('version');
prodVersion.addMethod('GET', prodIntegration);

#GET method for stg alias
const stg = api.root.addResource('stg');
const stgVersion = stg.addResource('version');
stgVersion.addMethod('GET', stgIntegration);

 

  • 次のコマンドを使用してCDKを展開しておきます。
cdk deploy

 

 

完全なコード

 

import { Construct } from 'constructs';
import { LambdaIntegration, RestApi} from 'aws-cdk-lib/aws-apigateway';
import { Runtime, Function, AssetCode, Version, Alias } from 'aws-cdk-lib/aws-lambda';
import { StackProps} from 'aws-cdk-lib';


export class versioningStack extends Construct {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id);

    //create Lambda function
    const lambdaFunction = new Function(this, "Lambda-Versioning", {
      code: new AssetCode("resources"),
      handler: "lambda-handler.handler",
      runtime: Runtime.PYTHON_3_9,
      functionName: "Lambda-Versioning",
    });

    //create Versions and Alias
    const LambdaVersionV1 = new Version(this, 'version-V1', {
        lambda: lambdaFunction
    });

    const PrdAlias = new Alias(this, 'V1-prd-alias', {
        aliasName: 'prd',
        version: LambdaVersionV1,
    });

    const LambdaVersionV2 = new Version(this, 'version-V2', {
        lambda: lambdaFunction
    });

    const StgAlias = new Alias(this, 'V2-stg-alias', {
        aliasName: 'stg',
        version: LambdaVersionV2,
    });


    const LatestVersion = lambdaFunction.latestVersion;
    const DevAlias = new Alias(this, 'dev-alias', {
            aliasName: 'dev',
            version: LatestVersion
        });

    const devIntegration = new LambdaIntegration(lambdaFunction);
    const prodIntegration = new LambdaIntegration(PrdAlias);
    const stgIntegration = new LambdaIntegration(StgAlias);

    // Create an API Gateway 
    const api = new RestApi(this, 'api', {
        restApiName: 'version-api',
        deploy: true
      });

    const dev = api.root.addResource('dev');
    const devVersion = dev.addResource('version');
    devVersion.addMethod('GET', devIntegration);

    const prod = api.root.addResource('prod');
    const prodVersion = prod.addResource('version');
    prodVersion.addMethod('GET', prodIntegration);

    const stg = api.root.addResource('stg');
    const stgVersion = stg.addResource('version');
    stgVersion.addMethod('GET', stgIntegration);
  }
}

 

APIをテストする

 

  • [dev] エイリアスをテストする。

 

  • [prod] エイリアスをテストする。

 

  • [stg] エイリアスをテストする。

 

まとめ

AWS CDKでLambdaバージョンとエイリアスをしてみました。

References :

Lambda Function Versions

Lambda Functions Aliases

Lambda versions with AWS CDK