前提条件
% node --version
v12.13.0
% npm --version
6.12.0
CDK をインストール
README を参考にして npm からインストールします。
% npm i -g aws-cdk
プロジェクトの初期化
適当なディレクトリを作成します。
% mkdir cdk-ec2
% cd cdk-ec2
初期化用のテンプレートは次のコマンドから確認できます。
% cdk init --list
Available templates:
* app: Template for a CDK Application
└─ cdk init app --language=[csharp|fsharp|java|javascript|python|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=[csharp|fsharp|java|javascript|python|typescript]
今回はテンプレートとして sample-app を選択しました。
% cdk init sample-app --language=typescript
コマンドを実行すると次のファイルとディレクトリが作成されます。
% tree -I node_modules -L 2 -a .
.
├── .git
│ ├── COMMIT_EDITMSG
│ ├── HEAD
│ ├── config
│ ├── description
│ ├── hooks
│ ├── index
│ ├── info
│ ├── logs
│ ├── objects
│ └── refs
├── .gitignore
├── .npmignore
├── README.md
├── bin
│ └── cdk-ec2.ts
├── cdk.context.json
├── cdk.json
├── jest.config.js
├── lib
│ └── cdk-ec2-stack.ts
├── package-lock.json
├── package.json
├── test
│ └── cdk-ec2.test.ts
└── tsconfig.json
インフラ構築用のコード以外にテストが追加されています。
git リポジトリの初期化も行ってくれるようです。
CDK の認証
aws-cli
と同じように --profile
オプションを指定して ~/.aws/config のプロファイルを指定できます。
% cdk diff --profile my-profile
自分の場合、次のエラーが発生しました。
% cdk diff --profile my-profile
Stack CdkEc2Stack
AWS region must be configured either when you configure your CDK stack or through the environment
~/.aws/config の source_profile のプロファイルから region を引き継がないようです。
[default]
region = ap-northeast-1
[profile my-profile]
role_arn = arn:aws:iam::123456789012:role/myrole
source_profile = default
~/.aws/config の my-profile へ region を追加した後、再度コマンドを実行します。
% cdk diff --profile my-profile
Stack CdkEc2Stack
Unable to resolve AWS account to use. It must be either configured when you define your CDK or through the environment
どうやら JavaScript の AWS SDK では MFA 認証が行えないようです。
aws-mfa を使用して temporary credentials を取得する必要があります。
まずは pip から aws-mfa をインストールします。
% pip install aws-mfa
~/.aws/credentials の default プロファイルを default-long-term プロファイルへ変更します。
[default-long-term]
aws_access_key_id = type_your_id
aws_secret_access_key = type_your_key
aws_mfa_device = type_your_mfa_arn
aws-mfa
コマンドを実行します。
aws-mfa
デバイスに表示されているコードの入力を求められるため、入力します。
すると ~/.aws/credentials の default プロファイルが追加されます。
[default-long-term]
aws_access_key_id = type_your_id
aws_secret_access_key = type_your_key
aws_mfa_device = type_your_mfa_arn
[default]
aws_access_key_id = xxxxx
aws_secret_access_key = yyyyy
aws_security_token = zzzzz
この状態で再度、CDK の認証を試みます。
% cdk diff --profile my-profile
Stack CdkEc2Stack
IAM Statement Changes
...長いので略
認証でだいぶハマってしまいました。
今回発生したエラーの詳細は次の issue にまとめられています。
https://github.com/aws/aws-cdk/issues/1656
VPC の構築
aws-ec2 モジュールを import した後、 Vpc クラスを new するだけです。
import cdk = require('@aws-cdk/core');
import ec2 = require('@aws-cdk/aws-ec2')
export class CdkEc2Stack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new ec2.Vpc(this, 'MyVpc');
}
}
コンストラクタの第三引数から作成する VPC のタイプを選択できます。
new ec2.Vpc(this, 'MyVpc', {
subnetConfiguration: [
{
cidrMask: 28,
subnetType: ec2.SubnetType.PUBLIC,
name: 'public'
},
]
});
インスタンスの構築
Instance クラスを new します。
コンストラクタの第三引数へインスタンスを構築する VPC とイメージ、インスタンスタイプを指定できます。
const image = new ec2.AmazonLinuxImage()
new ec2.Instance(this, 'MyInstance', {
vpc: vpc,
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T2, ec2.InstanceSize.MICRO),
machineImage: image
})
デプロイ
次のコマンドからデプロイすることができます。
% cdk deploy --profile my-profile
後始末は destroy
コマンドから行うことができます。
% cdk destroy --profile my-profile