LoginSignup
0
0

More than 1 year has passed since last update.

AWS CDK + TypeScript でサーバレス開発その1 : Hello world!

Last updated at Posted at 2022-07-03

概要

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関連のスクリプトも削除しておく。

package.json
  "scripts": {
-    "build": "tsc",
-    "watch": "tsc -w",
    "test": "jest",
    "cdk": "cdk"
  },

lambdaのビルドに使うesbuildをインストールする。

ターミナル
npm install --save-dev esbuild

lambdaの作成

CDKでlambdaを作成する。

lib/project-name-stack.ts
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のコンストラクタの第二引数に渡した文字列。)

lib/project-name-stack.api.ts
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を作成する。

lib/project-name-stack.ts
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を操作してみる(予定)。

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