AWS CDK - #1 CDKの導入

はじめに

いつの間にかインフラにまで手を伸ばし、さらにインフラをコードで管理するようになっていた管理人です。

AWSなんてまともに使ってもいない。インフラ設計すらやったことない、経験0からCDKの沼に飛び込んだ記録を書いてみます。

今回の一連の内容は、以下の環境にて行います。

  • macOS(v12.4)
  • AWSアカウント
    • 管理者(ルートユーザー)
  • NPM

一連の記事で作成したプロジェクトは以下にコミットされており、ブランチと記事番号が連動しています。

github.com

AWS CLIとは

AWS CLIとは、AWSのリソース作成・削除などをWebGUIではなく、コマンドラインから操作し、管理するためのツールです。

CLIは動作するプラットフォームや言語の制限を受けにくく、様々なOSで利用することができます。

CLIを使うメリットは、これまでGUIで行っていた管理を自動化したり、リソース作成などの処理を簡単に再現できることです。

AWS CLIのセットアップ

AWS CLIを利用するために、ツールをインストールします。

インストール方法は以下の公式サイトが準備されているため、この記事では割愛します。

docs.aws.amazon.com

CLIを利用するためにはCLI専用のIAMユーザーを作成して利用することが推奨されています。

ルートユーザーでアクセスキーなどを利用している場合、万が一アクセスキーが流出すると全てのリソースにアクセスする権限を渡すことになります。 そのため、CLIで利用する専用のIAMユーザーを作成して、必要最低限の権限を付与することが推奨されています。

IAMユーザーの作成

ルートユーザーでAWSコンソールにログインし、IAMサービスを開きます。アクセス管理からユーザータブを選択肢、ユーザーを追加します。

ユーザー名は「cdk_user」とします。cdk_userはログインを不要とし、CDKからのデプロイ等で利用するため、認証タイプは「アクセスキー・プログラムによるアクセス」を選択しておきます。

cdk_userには「AdministratorAccess」のアクセス権限を付与します。 開発・検証環境ではAdministratorAccessのアクセス権限を付与し、開始時の作業効率を上げています。

開発後、実際に使うリソースやスコープが決まり本番環境へ移行する際には、より細かいアクセス権限設定をする必要があります。

その後のタグ設定については、各自必要に応じて行ってください。最終的な設定は以下のようになっているかと思います。

ユーザーの設定が終わったら、ユーザーを作成します。

ここでアクセスキーIDとシークレットアクセスキーが表示されていますが、この画面以外で現在割り振られているシークレットアクセスキーなどは表示できなくなります。 そのため、CSVファイルを保存しておくか、シークレットアクセスキーを控えるようにしてください。

credentialsの設定

cdkのコマンドを利用するためには、今作成したCDK専用ユーザーのアクセスキー・シークレットアクセスキーを設定する必要があります。

ここでは aws-cliconfigure を用いて設定を行います。aws configure で設定したcredential情報が、デフォルトで各種AWSのツールから参照されるようになります。

そのため、複数のawsアカウントを設定したい場合には、profile オプションを利用して、credential情報に名前をもたせる必要があります。

今回は、デフォルトの設定として扱うため profile オプションは指定しません。

以下のコマンドを実行すると、credential情報を入力する表示となりますので、それぞれ入力していきます。

$ aws configure
AWS Access Key ID [None]: <アクセスキー>
AWS Secret Access Key [None]: <シークレットアクセスキー>
Default region name [None]: ap-northeast-1
Default output format [None]: json

デフォルトでデプロイ対象となるリージョンを ap-northeast-1 としていますが、必要に応じて変更してください。

設定が完了すると、~/.aws に2つのファイルが生成されているはずです。

CDKとは

  • CDKとは Cloud Development Kit の頭文字を取ったもの
  • AWSのリソースを特定の言語で作成するためのもの

CDKを記述できる言語は以下の通りで、メジャーな言語からマイナーな言語までカバーされています。

  • C#(.NET)
  • F#
  • Go
  • Java
  • Python
  • Shell
  • TypeScript

サンプルはAWS公式のGithubにあるので、参考にしてみてください。

github.com

CDKのインストール

まずは、CDKプロジェクトを管理するためのフォルダを作成します。(記事のGithubに合わせて、ディレクトリ名は aws-cdk-articles とします)

$ mkdir aws-cdk-articles
$ cd aws-cdk-articles

以下のコマンドでCDKをインストールします。

$ npm install aws-cdk

よくいろいろな記事で、-g というオプションをつけているものがありますが、-g はグローバルな領域に aws-cdk をインストールするという意味になります。

今後、複数のCDKプロジェクトを管理するようになると、グローバル領域にあると色々厄介なので今回はプロジェクト単位で管理できるように、-g をなくしてインストールします。

プロジェクト単位でインストールされたnpmライブラリは npx をprefixにコマンドを実行する必要があります。

# グローバルで実行する場合
$ cdk --version

# ローカルで実行する場合
$ npx cdk --version

さて、インストールされたCDKのバージョンをチェックします。

インストールしたときによってバージョンが異なりますので、適宜読み替えてください。

❯ npx cdk --version
2.27.0 (build 8e89048)

CDKプロジェクトの作成

CDKプロジェクトの作成は空ディレクトリで行う必要があるため、新規ディレクトリを作成して移動します。

$ mkdir cdk-project
$ cd cdk-project
$ npx cdk init app --language typescript
Applying project template app for typescript
# Welcome to your CDK TypeScript project

This is a blank project for CDK development with TypeScript.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

* `npm run build`   compile typescript to js
* `npm run watch`   watch for changes and compile
* `npm run test`    perform the jest unit tests
* `cdk deploy`      deploy this stack to your default AWS account/region
* `cdk diff`        compare deployed stack with current state
* `cdk synth`       emits the synthesized CloudFormation template

Executing npm install...
✅ All done!

cdkで作成できるプロジェクトタイプは、以下の種類が存在していますが、今回はCDKアプリケーションを作成するため app を指定しています。

Available templates:
* app: Template for a CDK Application
   └─ cdk init app --language=typescript
* lib: Template for a CDK Construct Library
   └─ cdk init lib --language=typescript
* sample-app: Example CDK Application with some constructs
   └─ cdk init sample-app --language=typescript

実行後、以下のようなディレクトリ構成となっていればOKです。

aws-cdk-articles on  01-cdk_install via  v16.5.0 on ☁️  (ap-northeast-1) 
❯ ll
Permissions Size User     Group Date Modified Name
drwxr-xr-x     - h.nomura staff 25 Jun 16:43  .
drwxr-xr-x     - h.nomura staff 25 Jun 16:53  ├── .git
drwxr-xr-x     - h.nomura staff 22 Jun 21:44  ├── cdk-project
.rw-r--r--    93 h.nomura staff 22 Jun 21:43  │  ├── .gitignore
.rw-r--r--    65 h.nomura staff 22 Jun 21:43  │  ├── .npmignore
drwxr-xr-x     - h.nomura staff 22 Jun 21:43  │  ├── bin
.rw-r--r--   982 h.nomura staff 22 Jun 21:43  │  ├── cdk.json
.rw-r--r--   157 h.nomura staff 22 Jun 21:43  │  ├── jest.config.js
drwxr-xr-x     - h.nomura staff 22 Jun 21:43  │  ├── lib
drwxr-xr-x     - h.nomura staff 22 Jun 21:44  │  ├── node_modules
.rw-r--r--  299k h.nomura staff 22 Jun 21:44  │  ├── package-lock.json
.rw-r--r--   573 h.nomura staff 22 Jun 21:43  │  ├── package.json
.rw-r--r--   536 h.nomura staff 22 Jun 21:43  │  ├── README.md
drwxr-xr-x     - h.nomura staff 22 Jun 21:43  │  ├── test
.rw-r--r--   650 h.nomura staff 22 Jun 21:43  │  └── tsconfig.json
drwxr-xr-x     - h.nomura staff 22 Jun 21:33  ├── node_modules
.rw-r--r--  1.6k h.nomura staff 22 Jun 21:33  ├── package-lock.json
.rw-r--r--    52 h.nomura staff 22 Jun 21:33  ├── package.json
.rw-r--r--    20 h.nomura staff 22 Jun 21:18  └── README.md

これでCDKの導入は完了です。

次の章では、実際にCDKで簡単なリソースをデプロイしてみたいと思います。