Posted at

AWS-CDK使ってみた件


AWS-CDKとは何ぞや

AWSの環境定義を"Java", "TypeScript", "JavaScript"の言語で定義するCDK(Cloud Development Kit)だそうな。

開発者レビューにも記載があるとおり、".NET", "Python"が近々対応予定とのこと。

個人的にはRubyもお願いしたいところではある。

以下を参考にしながらお試しでいじってみた。


さっそくいじる

スタートガイドとリファレンスを読みながら試す。


検証環境

CentOS 6


必要なものをそろえる


  • aws-cli

  • Node.js (8.11.x 以上)

  • aws-cdk


aws-cli

pipがない場合、pipをインストール。

もしpipのインストールで SyntaxError がでる場合はPythonのバージョンが古いことが原因だったりするので

$ curl -O https://bootstrap.pypa.io/2.6/get-pip.py で古いバージョンを持ってくる。

$ curl -O https://bootstrap.pypa.io/get-pip.py

$ python get-pip.py --user

pip を使用してaws-cliをインストール

$ pip install awscli --upgrade --user

認証情報設定

$ aws configure

AWS Access Key ID [None]: AKIAIOSFO***********
AWS Secret Access Key [None]: wJalrX**********************************
Default region name [None]: ap-northeast-1
Default output format [None]: json


Node.js

ただ単にsudo yum -y install nodejsを叩いても古いバージョンがインストールされてしまうので以下を root でうつ。

$ curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -

インストール実行/確認

$ sudo yum -y install nodejs

$ node -v
v8.11.4


aws-cdk

スタートガイドのコマンドを叩くだけ。

$ npm install -g aws-cdk

$ cdk --version
0.9.0 (build b222731)


プロジェクト作成

①ディレクトリ作成/移動

$ mkdir hello-cdk

$ cd hello-cdk

②プロジェクトの初期化(今回はtypescriptを使用)

$ cdk init app --language typescript

Applying project template app for typescript
Initializing a new git repository...
Executing npm install...
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN hello-cdk@0.1.0 No repository field.
npm WARN hello-cdk@0.1.0 No license field.

# Useful commands

* `npm run build` compile typescript to js
* `npm run watch` watch for changes and compile
* `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

$ ls

bin cdk.json node_modules package.json package-lock.json README.md tsconfig.json
$
$ ls bin/
hello-cdk.d.ts hello-cdk.js hello-cdk.ts

bin配下にはサンプルアプリケーションが配置される


AWS CDKコアライブラリ(@aws-cdk/cdk)をインストール

npm install @aws-cdk/cdk @types/node

その他ライブラリが必要な場合はリファレンス(2018/09/13時点で最新のver0.9.0)を見て適宜インストール。


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

空のアプリケーションファイルindex.tsの作成

$ cat bin/index.ts

import cdk = require('@aws-cdk/cdk');

class MyApp extends cdk.App {
constructor(argv: string[]) {
super(argv);
}
}

process.stdout.write(new MyApp(process.argv).run());

作成後ビルド(ts -> js)

npm run build

エラーがでなければ問題なし


実行プログラム指定

プロジェクトのルートディレクトリのcdk.jsonを編集

$ cat cdk.json

{
"app": "node bin/index.js"
}


スタックリスト確認

プロジェクトフォルダ内でcdk lsコマンドを叩く(現時点では空の状態)

$ cdk ls -l

[]


スタック定義

index.tsに追記

$ cat bin/index.ts

import cdk = require('@aws-cdk/cdk');

class MyStack extends cdk.Stack {
constructor(parent: cdk.App, id: string, props?: cdk.StackProps) {
super(parent, id, props);
}
}

class MyApp extends cdk.App {
constructor(argv: string[]) {
super(argv);

new MyStack(this, 'hello-cdk');
}
}

process.stdout.write(new MyApp(process.argv).run());

追記後ビルド

$ npm run build


再度スタックリスト確認

プロジェクトフォルダ内でcdk lsコマンドを叩く

$ cdk ls -l

-
name: hello-cdk
environment:
name: <AWSアカウントID>/<デフォルトリージョン>
account: '<AWSアカウントID>'
region: <デフォルトリージョン>


ためしにEC2インスタンスを立ててみる


EC2のライブラリをインストール

npm i @aws-cdk/aws-ec2


定義修正

個人の環境の合わせて修正。

$ cat bin/index.ts

import cdk = require('@aws-cdk/cdk');
import ec2 = require('@aws-cdk/aws-ec2');

class MyStack extends cdk.Stack {
constructor(parent: cdk.App, id: string, props?: cdk.StackProps) {
super(parent, id, props);

new ec2.cloudformation.InstanceResource(this, 'MyInstance', {
imageId: 'ami-XXXXXXX',
instanceType: 't2.small',
subnetId: 'subnet-XXXXXXXX',
monitoring: false
});
}
}

class MyApp extends cdk.App {
constructor(argv: string[]) {
super(argv);

new MyStack(this, 'hello-cdk');
}
}

process.stdout.write(new MyApp(process.argv).run());

その他鍵ファイルやプライベートアドレスを指定する場合はリファレンスを参照。


yamlで確認

$ cdk synth

Resources:
MyInstance:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: ami-XXXXXXX
InstanceType: t2.small
Monitoring: false
SubnetId: subnet-XXXXXXXX
CDKMetadata:
Type: 'AWS::CDK::Metadata'
Properties:
Modules: '@aws-cdk/aws-ec2=0.9.0,@aws-cdk/aws-elasticloadbalancing=0.9.0,@aws-cdk/cdk=0.9.0,@aws-cdk/cx-api=0.9.0,hello-cdk=0.1.0,js-base64=2.4.5'


デプロイ

$ cdk deploy

⏳ Starting deployment of stack hello-cdk...
[0/7] Currently in progress:
✅ Deployment of stack HelloCdkStack completed successfully, it has ARN arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/hello-cdk/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX hello-cdk


確認

スタックが成功し、インスタンスが立ち上がっていれば問題なし。

aws-cliからでも確認可。


最後に

今回はTypeScriptを使用したが、これからPythonも使えるので今後に期待。

2018/9/13時点では最新バージョンは0.9.0となっているが、サポートしているサービスがかなり多いので興味ある人はいじってみるといいと思う。