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

下記のようにAWSリソースの命名規則を決めておくと、管理が楽になると思います。 そこで、AWS CDKのメリットであるコードで書けるを活用して、AWSリソースの命名ロジックを作ってみました。
2019.09.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

下記のように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の様子

DynamoDB

DynamoDBの様子

さいごに

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

参考