今回、業務でインフラ構築をする際にAWS CDKを利用してみました。
個人的に初めての利用だったので、プロジェクトの作成からデプロイまでを備忘録として残します。
また、個人的に気になった箇所を調査した内容等も添えています。
プロジェクトディレクトリを作成します。
$ mkdir cdk-app
$ cd cdk-app
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のバージョンを確認するため以下を実行
$ npx ts-node --version
バージョンを確認したところ、まだnodeがインストールされておらず、
以下の選択が出たのでyを選択してインストールを行いました。
Need to install the following packages:
ts-node@10.9.2
Ok to proceed? (y)
ここまででプロジェクトの作成が完了しました。
CDKの記述をまだ追加していないのですが、
デプロイをする前に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 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がリソースをデプロイする際に、権限を付与するために必要です。
初回実行後にリージョンを指定していなかった事に気付き、リージョンの変更をするために
lib/stack.tsにリージョンを指定し、bootstrapを再実行しました。
いよいよデプロイをしていきます。 以下のコマンドを実行します。
$ cdk deploy
今回は複数のサービス追加を行う前にデプロイをしたため、特にエラーは出ませんでした。
デプロイ後、AWSコンソールでS3のバケットが作成されていることを確認できればデプロイ完了です。
今回は、一旦デプロイをした後にプロジェクトに必要なサービスや記述を追加し、
少しずつデプロイをしながら開発を進めることにより、エラーの原因箇所の特定がしやすかったと感じました。
実は初めにCDKの記述をまとめて追加してデプロイを試みたのですが、
大量のエラー、ロールバックに時間がかかってしまう...などを経験したため、
今後CDKに慣れるまでは、少しずつ開発を進めようと思いました。
最後までお読みいただきありがとうございました。