AQ Tech Blog

初めてのCDK構築 & デプロイ

作成者: chihiro.fujiwara|2024年09月30日

はじめに

今回、業務でインフラ構築をする際にAWS CDKを利用してみました。
個人的に初めての利用だったので、プロジェクトの作成からデプロイまでを備忘録として残します。
また、個人的に気になった箇所を調査した内容等も添えています。

AWS CDKの導入

プロジェクト作成

プロジェクトディレクトリを作成します。

$ mkdir cdk-app
$ cd cdk-app

AWS CDKアプリケーション作成

AWS CDKアプリケーション作成のため、以下のコマンドを実行

$ npx aws-cdk init app --language=typescript

※エラーメモ
npx aws-cdk init appだけで実行すると以下のエラーが出るので
 言語オプションを追加する事でエラーの解消ができました。

Available languages for app: csharp, fsharp, go, java, javascript, python, typescript

No language was selected

上記を実行して以下のようなディレクトリ構成が作成されるか確認します。

cdk-app/
├── bin/
│ └── cdk-app.ts
├── lib/
│ └── cdk-app-stack.ts
├── node_modules
├── test/
│ └── cdk-app.test.ts
├── cdk.json
├── jest.config.js
├── package-lock.json
├── package.json
├── README.md
└── tsconfig.json

インフラストラクチャの定義

次にlib/{project_name}-stack.tsというファイルを作り、rootスタックを追加します。

// 例)
import { StackProps } from "aws-cdk-lib";
import * as lambda from 'aws-cdk-lib/aws-lambda';

【余談】インポート文の書き方

StackPropsは明示的に特定のクラスのみをインポートしており、
lambdaはライブラリ全体を名前空間に取り込んでいます。
これらは以下の観点から判断しました。

▼インポートするモジュールのサイズ
必要以上にインポートされる可能性があるため、パフォーマンス等に影響する

▼コードの可読性(保守、運用を考慮する)
使用する要素の数に合わせて記述を変更する事により、コードの記述量の削減を図る事ができる
また、システム改修などでコードを見直す際のモジュールの確認のしやすさ等を考慮する


nodeの確認

nodeのバージョンを確認するため以下を実行

$ npx ts-node --version

バージョンを確認したところ、まだnodeがインストールされておらず、
以下の選択が出たのでyを選択してインストールを行いました。

Need to install the following packages:
ts-node@10.9.2
Ok to proceed? (y)

間話

ここまででプロジェクトの作成が完了しました。

CDKの記述をまだ追加していないのですが、
デプロイをする前にCDKの記述をまとめて追加すると
デプロイが中々通らず苦戦したので、一旦ベースを作ってデプロイした上で
記述を少しずつ足していくと良いかなと個人的に感じました。

AWS CDKのデプロイ

リソースの作成

今回はサンプルとしてS3のバケットを作成します。
lib/cdk-app-stack.tsに以下の記述を追加します。

import * as s3 from 'aws-cdk-lib/aws-s3';

new s3.Bucket(this, 'SampleBucket', {
versioned: true,
removalPolicy: cdk.RemovalPolicy.DESTROY,
});

デプロイ後に、コンソール画面からS3のバケットが作成できているか確認します。

AWSアカウント環境変数の設定

AWS CLIを使用するために、環境変数を設定します。
今回はSSOを使用しているため、AWS_SESSION_TOKENも追加で設定します。
以下のコマンドを実行します。
※デフォルトは1時間でセッションの有効期限が切れるので定期的に再実行が必要です。

export AWS_ACCESS_KEY_ID=your-access-key
export AWS_SECRET_ACCESS_KEY=your-secret-key
export AWS_SESSION_TOKEN=your-session_token

※your-access-keyなどはaws access portalなどで確認

テンプレートの出力

CDKコードをCloudFormationテンプレートに変換するため、
以下のコマンドを実行します。

$ cdk synth

※エラーメモ
テンプレートの出力を行うと以下のエラーが出ました。

[WARNING] aws-cdk-lib.aws_ec2.VpcProps#cidr is deprecated.
Use ipAddresses instead
This API will be removed in the next major release.

解消方法:記述を以下のように変更する事でエラーが解消できました。

cidr: vpcCidr // 修正前
ipAddresses: ec2.IpAddresses.cidr(vpcCidr) // 修正後

AWS CDKのバージョンアップにより、VpcPropsクラスのプロパティcidr が非推奨になり、
代わりにipAddressesが推奨されるようになったため、上記の修正を行いました。

ブートストラップ

デプロイする際に、事前にCDKが使用するために必要なリソースを準備するため、以下のコマンドを実行します。

$ cdk bootstrap

実行後に以下が返ってきたらOK

 ✅  Environment aws://{account_id}/us-east-1 bootstrapped.

S3バケット: CDKが生成したCloudFormationテンプレートやアセット(Lambda関数のコードなど)を一時的に保存するために使われます。
IAMロール:CDKがリソースをデプロイする際に、権限を付与するために必要です。

【余談】bootstrapの再実行

初回実行後にリージョンを指定していなかった事に気付き、リージョンの変更をするために
lib/stack.tsにリージョンを指定し、bootstrapを再実行しました。

CDKデプロイ

いよいよデプロイをしていきます。 以下のコマンドを実行します。

$ cdk deploy

今回は複数のサービス追加を行う前にデプロイをしたため、特にエラーは出ませんでした。
デプロイ後、AWSコンソールでS3のバケットが作成されていることを確認できればデプロイ完了です。

まとめ

今回は、一旦デプロイをした後にプロジェクトに必要なサービスや記述を追加し、
少しずつデプロイをしながら開発を進めることにより、エラーの原因箇所の特定がしやすかったと感じました。

実は初めにCDKの記述をまとめて追加してデプロイを試みたのですが、
大量のエラー、ロールバックに時間がかかってしまう...などを経験したため、
今後CDKに慣れるまでは、少しずつ開発を進めようと思いました。

最後までお読みいただきありがとうございました。