AWS
aws-cdk

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となっているが、サポートしているサービスがかなり多いので興味ある人はいじってみるといいと思う。