この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
概要
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 :