概要
AWS CDKでサーバレス環境を構築するシンプルな方法のメモ。
前提
- 筆者の環境はMac + VSCode。
- AWS CDKを使ったことがある。
- Node.jsがインストールされている。
手順
雛形の作成
aws-cdkを使ってプロジェクトの雛形を作成する。
mkdir project-name
cd project-name
cdk init app --language typescript
TypeScriptは直接ts-nodeが実行するので、typescriptパッケージはアンインストールしておく。tsconfig.jsonも削除する。
npm uninstall typescript
rm tsconfig.json
package.jsonからtsc関連のスクリプトも削除しておく。
"scripts": {
- "build": "tsc",
- "watch": "tsc -w",
"test": "jest",
"cdk": "cdk"
},
lambdaのビルドに使うesbuildをインストールする。
npm install --save-dev esbuild
lambdaの作成
CDKでlambdaを作成する。
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs'; // aws-lambda-nodejsのインポートを追加
export class ProjectNameStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// lambdaを作成
let apiFunction = new lambda.NodejsFunction(this, 'api', {
bundling: {
sourceMap: true,
minify: true,
},
});
}
}
同じディレクトリにproject-name-stack.api.tsファイルを作成する。("api"は上でNodejsFunctionのコンストラクタの第二引数に渡した文字列。)
import * as lambda from 'aws-lambda';
export const handler = async (event: lambda.APIGatewayEvent, context: lambda.Context): Promise<lambda.APIGatewayProxyResult> => {
// 「Hello world!」に続けてパスを表示するだけの関数
return {
statusCode: 200,
headers: { 'Content-Type': 'text/plain' },
body: `Hello world! This is ${event.path}\n`,
};
};
aws-lambdaのインポートがエラーになるのでインストールする。(これでevent等の引数に補完が効くようになる。)
npm install @types/aws-lambda
APIGatewayの作成
CDKでAPIGatewayを作成する。
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as apigateway from 'aws-cdk-lib/aws-apigateway'; // aws-apigatewayのインポートを追加
import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs';
export class ProjectNameStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const apiFunction = new lambda.NodejsFunction(this, 'api', {
bundling: {
sourceMap: true,
minify: true,
},
});
// APIGatewayを作成
const apiGateway = new apigateway.LambdaRestApi(this, 'api-gateway', {
handler: apiFunction,
endpointTypes: [apigateway.EndpointType.REGIONAL],
});
}
}
デプロイ
まず、今回のデプロイで発生する差分を確認する。
cdk diff
初回なので、全てのリソースが追加されることが確認できる。
確認したら、デプロイする。
cdk deploy
動作確認
デプロイが完了すると、次のように出力される。
Outputs:
ProjectNameStack.apigatewayEndpointXXXXXXXX = https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/
このURLをブラウザで開いて次のように表示されれば成功。
Hello world! This is /
まとめ
サーバレスで簡単にHello world!を表示することができた。
次回は今回作ったAPIでDynamoDBを操作してみる(予定)。