AWS CDKでLambdaバージョンとエイリアスをしてみた。
概要
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 :