[AWS CDK] 地味にめんどくさいAWSリソースの命名をロジック化してみた

下記のようにAWSリソースの命名規則を決めておくと、管理が楽になると思います。

……ですが、CloudFormationやAWS SAMを使って書くと、まぁ、地味にめんどくさいです(個人の感想です)

そこで、AWS CDKのメリットであるコードで書けるを活用して、AWSリソースの命名ロジックを作ってみました。

目次

環境

項目 バージョン
macOS Mojave 10.14.6
AWS CDK 1.7.0 (build 8870695)
node v10.16.1
npm 6.9.0

全体図

WebAPIを2つ、Lambdaを2つ、DynamoDBを1つ作ります。

構成図

※Lambdaコードは省略します。DynamoDBは作るだけです。

AWS CDKプロジェクトの構築

$ mkdir AWSCDK-ResourceNameSample
$ cd AWSCDK-ResourceNameSample
$ cdk init app --language=typescript

必要なライブラリをインストールします。

$ npm install --save @aws-cdk/aws-apigateway
$ npm install --save @aws-cdk/aws-lambda
$ npm install --save @aws-cdk/aws-dynamodb

リソース名を決めるロジックを作成する

やりたかったのはこれですね。AWSリソース名の作成ロジックを行うファイルを作成します。

$ touch lib/resourceName.ts

続いてコードを下記にします。やってることは単純ですね。

これを用いれば、

  • SystemName: AWS-CDK-Resource-Sample
  • SystemEnv: dev

としたとき、次のような命名になります。

種類 コード例 リソース名(結果)
CloudFormation Stack resourceName.stackName('App') AWS-CDK-Resource-Sample-dev-App-stack
API Gateway resourceName.apiName('user') AWS-CDK-Resource-Sample-dev-user-api
Lambda resourceName.lambdaName('create-user') AWS-CDK-Resource-Sample-dev-create-user-function
Lambda resourceName.lambdaName('get-user') AWS-CDK-Resource-Sample-dev-get-user-function
DynamoDB resourceName.dynamodbName('user') AWS-CDK-Resource-Sample-dev-user-table

AWS CDKで適当にWebAPIを作る

以下、やってみました。

Lambdaコードを書く!

まずはファイルを作ります。

$ mkdir -p src/lambda/
$ touch src/lambda/create_user.ts
$ touch src/lambda/get_user.ts

続いてコードを下記にします。

インフラをコードで書く!!!

bin/awscdk-resource_name_sample.tsを下記にします。ResourceNameクラスのインスタンスを作成し、Stack作成クラスに渡しています。

lib/awscdk-resource_name_sample-stack.tsを下記にします。受け取ったResourceNameクラスを利用して、AWSリソース名を決定しています。

ビルドする

npm run build

デプロイする

開発環境としてデプロイする

SYSTEM_ENV=dev cdk deploy

スタック作成が完了すると、エンドポイント(WebAPIのアドレス)が表示されるので、メモしておきます。

Outputs:
AWS-CDK-Resource-Sample-dev-App-stack.AWSCDKResourceSampledevuserapiEndpoint1111 = https://xxxx.execute-api.ap-northeast-1.amazonaws.com/prod/

本番環境としてデプロイする

SYSTEM_ENV=prod cdk deploy

スタック作成が完了すると、エンドポイント(WebAPIのアドレス)が表示されるので、メモしておきます。

Outputs:
AWS-CDK-Resource-Sample-prod-App-stack.AWSCDKResourceSampleproduserapiEndpoint2222 = https://yyyy.execute-api.ap-northeast-1.amazonaws.com/prod/

動作確認

開発環境

開発環境にデプロイした際のエンドポイントを叩きます。

$ curl -X POST https://xxxx.execute-api.ap-northeast-1.amazonaws.com/prod/user/1234
{"env":"dev","message":"create user id: 1234"}
$ curl -X GET https://xxxx.execute-api.ap-northeast-1.amazonaws.com/prod/user/1234
{"env":"dev","message":"get user id: 1234"}

開発環境のLambdaが動いています!

本番環境

本番環境にデプロイした際のエンドポイントを叩きます。

$ curl -X POST https://yyyy.execute-api.ap-northeast-1.amazonaws.com/prod/user/1234
{"env":"prod","message":"create user id: 1234"}
$ curl -X GET https://yyyy.execute-api.ap-northeast-1.amazonaws.com/prod/user/1234
{"env":"prod","message":"get user id: 1234"}

本番環境のLambdaが動いています!

AWSの様子

ブラウザでログインして、それぞれの様子を確認しました。バッチリです!

CloudFormation

CloudFormationの様子

API Gateway

API Gatewayの様子

API Gatewayの様子(dev) 

API Gatewayの様子(prod) 

Lambda

Lambdaの様子

DybamoDB

DynamoDBの様子

さいごに

「コードでAWSインフラが書ける」というメリットをもっと活かしてみたいです。書いてて楽しいですね!!

参考