45
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

NRI OpenStandia Advent Calendar 2022

Day 7

AWS CDK + LocalStackでAWSサーバーレス環境をローカルに構築してみた

Last updated at Posted at 2022-12-06

はじめに

昨年度書いたこちらの記事のLocalStackが2022年7月に正式リリースされたということで、今年のアドベントカレンダーもLocalStackについて書きます。
今回はAWS CDK (AWS Cloud Development Kit)を使用し、LocalStack上にサーバレスアプリケーションを構築します。

環境構築

LocalStackの環境構築については、こちらを参照してください。

LocalStackの起動

LocalStackの起動方法はいくつかありますが、今回は以下のコマンドでLocalStackを起動します。

localstack start

以下コマンドでLocalStackの起動確認を行います。

curl http://localhost:4566/health
# 結果
{"features": {"initScripts": "initialized"}, "services": {"acm": "available", "apigateway": "available", "cloudformation": "running", "cloudwatch": "available", "config": "available", "dynamodb": "available", "dynamodbstreams": "available", "ec2": "available", "es": "available", "events": "running", "firehose": "available", "iam": "running", "kinesis": "available", "kms": "available", "lambda": "available", "logs": "available", "opensearch": "available", "redshift": "available", "resource-groups": "available", "resourcegroupstaggingapi": "available", "route53": "available", "route53resolver": "available", "s3": "running", "s3control": "available", "secretsmanager": "available", "ses": "available", "sns": "available", "sqs": "available", "ssm": "running", "stepfunctions": "available", "sts": "running", "support": "available", "swf": "available", "transcribe": "available"}, "version": "1.3.0.dev"}

以下のコマンドでも起動確認可能です。

localstack status services

#結果
┏━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓
┃ Service                  ┃ Status      ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━┩
│ acm                      │ ✔ available │
│ apigateway               │ ✔ available │
│ cloudformation           │ ✔ running   │
│ cloudwatch               │ ✔ available │
│ config                   │ ✔ available │
│ dynamodb                 │ ✔ available │
│ dynamodbstreams          │ ✔ available │
│ ec2                      │ ✔ available │
│ es                       │ ✔ available │
│ events                   │ ✔ running   │
│ firehose                 │ ✔ available │
│ iam                      │ ✔ running   │
│ kinesis                  │ ✔ available │
│ kms                      │ ✔ available │
│ lambda                   │ ✔ available │
│ logs                     │ ✔ available │
│ opensearch               │ ✔ available │
│ redshift                 │ ✔ available │
│ resource-groups          │ ✔ available │
│ resourcegroupstaggingapi │ ✔ available │
│ route53                  │ ✔ available │
│ route53resolver          │ ✔ available │
│ s3                       │ ✔ running   │
│ s3control                │ ✔ available │
│ secretsmanager           │ ✔ available │
│ ses                      │ ✔ available │
│ sns                      │ ✔ available │
│ sqs                      │ ✔ available │
│ ssm                      │ ✔ running   │
│ stepfunctions            │ ✔ available │
│ sts                      │ ✔ running   │
│ support                  │ ✔ available │
│ swf                      │ ✔ available │
│ transcribe               │ ✔ available │
└──────────────────────────┴─────────────┘

CDKプロジェクトの作成

AWS CDKのバージョンはv2を使っています。

mkdir (任意のディレクトリ名)
cd (作成したディレクトリ名)
npm install -g aws-cdk-local aws-cdk
cdklocal init --language typescript

CDKプロジェクトの作成は、cdkコマンドでも作成できますが、LocalStack用のprofile
準備必要があるため、今回はcdklocalコマンドを使用します。

cdklocal initコマンドは空のディレクトリで実行する必要があります。

API GatewayとLambdaの構築

API GatewayとLambdaを利用したサーバレス環境を構築します。
API GatewayとLambdaの詳細については、以下を参照してください。

構成のイメージは以下のようになります。
名称未設定ファイル.drawio (2).png

ディレクトリ構成

.
├── README.md
├── bin              
├── cdk.context.json 
├── cdk.json        
├── cdk.out          
├── jest.config.js  
├── lib
|    ├──cdk-demo-stack.ts // API Gatewayやlambdaを作成
|    ├── lambda
|          ├── hello.js  //lambda関数
├── node_modules
├── package-lock.json
├── package.json
├── test
└── tsconfig.json

API GatewayとLambdaの作成

API GatewayとLambdaを作成するCDKのソースコードは以下になります。

cdk-demo-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as apigateway from "aws-cdk-lib/aws-apigateway";
import * as lambda from 'aws-cdk-lib/aws-lambda';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    // lambda作成
    const hello = new lambda.Function(this, 'HelloFunction', {
      runtime: lambda.Runtime.NODEJS_14_X,
      handler: 'hello.handler',
      code: lambda.Code.fromAsset('lib/lambda'),
    });
    // API Gateway作成
    new apigateway.LambdaRestApi(this, 'APIEndpoint', {
      handler: hello,
    });
      }
}

次にLambda関数を実装します。
今回は簡単な「Hello World」を返すLambda関数を実装します。

hello.js
exports.handler =  async function(event, context) {
    return {
        statusCode:200,
        headers: {'Content-Type': 'texy/plain'},
        body: 'Hello World'
    }
}

LocalStackへデプロイ

デプロイ前の初期設定

デプロイする最初の一回のみ以下コマンドを実行します。このコマンドが正常に終了すれば、デプロイすることができます。

cdklocal bootstrap

以下コマンドでデプロイします。

cdklocal deploy

デプロイ完了すると、以下のようにURLが払い出されます。

 ✅  CdkDemoStack

✨  Deployment time: 6.3s

Outputs:
CdkDemoStack.MyEndpoint20B13C5B = https://232d1rbga1.execute-api.localhost.localstack.cloud:4566/prod/
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:000000000000:stack/CdkDemoStack/9822884c

✨  Total time: 19.76s

疎通確認

上で払い出されたURLにアクセスしたくなりますが公式ドキュメントに書かれているように、ローカル環境でアクセスする場合は以下のようになります。

- 払い出されたURL:https://232d1rbga1.execute-api.localhost.localstack.cloud:4566/prod/
+ アクセスする場合のURL:http://localhost:4566/restapis/<apiId>/<stageId>/_user_request_/
  • apiId
    • API Gatewayに割り当てられた識別子です。今回の場合、232d1rbga1となります。
  • stageId
    • API Gatewayのステージ名です。今回の場合、prodとなります。

_user_request_は固定でそのまま含める必要があります。

作成したAPI Gatewayを確認したい場合は以下コマンドを使用します。

aws apigateway get-rest-apis --endpoint-url=http://localhost:4566 --profile <LocalStack用のprofile>

curlコマンドを使用すると、「Hello World」と返ってきます。

 curl http://localhost:4566/restapis/232d1rbga1/prod/_user_request_/
# 結果
Hello World

おわりに

今回はAWS CDKとLocalStackを使用し、サーバレス環境を構築しました。
正式リリースされたということもありlocalStackコマンドで起動やcdklocalコマンドなどLocalStackでの開発がしやすくなったと感じました。
AWSへの認証情報を環境変数等に設定しておくことで、ローカルとAWS上で同じソースコードで動作するので、ローカルでのテストに活用できそうです。
公式ガイドにもあるようにLocalStackはクラウド関係の様々なツールをサポートしているので、興味のある方はぜひ試してみてください!

参考

45
23
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
45
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?