y-ohgi's blog

しがないSREなフリーランスの徒然

aws-cdkを試す

概要

awslabs/aws-cdk を試した。
一言で言うと「CloudFormationをコード(JavaScript/Java)で記述するためのライブラリ」。

試す

公式のGetting Startedをやってみる
Hello, AWS CDK! — AWS Cloud Development Kit 0.8.0+0eede70 documentation

0. 環境を用意する

aws-cdkはローカルに $ npm install -g aws-cdk でインストールする必要がある。
さすがに抵抗があるのでDockerを用意する。気にならなければnpmでグローバルインストールがはやいとおもわれ

FROM node:10-alpine

RUN npm install -g aws-cdk \
    && apk add --no-cache git

Dockerをビルドして起動。
起動の際にカレントディレクトリをマウント後、.gitconfigとawsのクレデンシャルを渡す。

$ docker build -t cdk .
$ mkdir app
$ cd app
$ docker run \
  -it \
  -v $HOME/.aws:/root/.aws \
  -v $HOME/.gitconfig:/root/.gitconfig \
  -v `pwd`:/app \
  -w /app \
  cdk ash

1. プロジェクトの作成

cdk init でプロジェクトの作成をする。
言語がTypeScriptとJavaしか対応してない模様。 cdk init で作成しなければJavaScriptでも書けるみたい。

とりあえずTypeScriptで作成

$ cdk init app --language typescript

f:id:y-ohgi:20180806221727p:plain

2. デプロイしてみる

プロジェクトの作成に成功すると諸々生成される

$ tree -I 'node_modules'
.
|-- README.md
|-- bin
|   `-- app.ts
|-- cdk.json
|-- package-lock.json
|-- package.json
`-- tsconfig.json

1 directory, 6 files

本体としては bin/app.ts (以下のファイル)のTypeScriptっぽい。

#!/usr/bin/env node
import sns = require('@aws-cdk/aws-sns');
import sqs = require('@aws-cdk/aws-sqs');
import cdk = require('@aws-cdk/cdk');

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

        const queue = new sqs.Queue(this, 'AppQueue', {
            visibilityTimeoutSec: 300
        });

        const topic = new sns.Topic(this, 'AppTopic');

        topic.subscribeQueue(queue);
    }
}

const app = new cdk.App(process.argv);

new AppStack(app, 'AppStack');

process.stdout.write(app.run());

なんかSNSとSQSが作成されそう。
とりあえずビルドしてデプロイ

$ npm run build
$ cdk deploy
/share/app # cdk deploy
 ⏳  Starting deployment of stack AppStack...
[0/2] Mon Aug 06 2018 06:47:09 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::CloudFormation::WaitConditionHandle] WaitCondition
[0/2] Mon Aug 06 2018 06:47:10 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::CloudFormation::WaitConditionHandle] WaitCondition Resource creation Initiated
[1/2] Mon Aug 06 2018 06:47:10 GMT+0000 (Coordinated Universal Time)  CREATE_COMPLETE     [AWS::CloudFormation::WaitConditionHandle] WaitCondition
[2/2] Mon Aug 06 2018 06:47:12 GMT+0000 (Coordinated Universal Time)  CREATE_COMPLETE     [AWS::CloudFormation::Stack] AppStack
[0/7] Mon Aug 06 2018 06:47:26 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::SNS::Topic] AppTopic115EA044
[0/7] Mon Aug 06 2018 06:47:26 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::SQS::Queue] AppQueueFD3F4958
[0/7] Mon Aug 06 2018 06:47:26 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::CDK::Metadata] CDKMetadata
[0/7] Mon Aug 06 2018 06:47:26 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::SNS::Topic] AppTopic115EA044 Resource creation Initiated
[0/7] Mon Aug 06 2018 06:47:26 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::SQS::Queue] AppQueueFD3F4958 Resource creation Initiated
[1/7] Mon Aug 06 2018 06:47:27 GMT+0000 (Coordinated Universal Time)  CREATE_COMPLETE     [AWS::SQS::Queue] AppQueueFD3F4958
[1/7] Mon Aug 06 2018 06:47:29 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::CDK::Metadata] CDKMetadata Resource creation Initiated
[2/7] Mon Aug 06 2018 06:47:29 GMT+0000 (Coordinated Universal Time)  CREATE_COMPLETE     [AWS::CDK::Metadata] CDKMetadata
[3/7] Mon Aug 06 2018 06:47:37 GMT+0000 (Coordinated Universal Time)  CREATE_COMPLETE     [AWS::SNS::Topic] AppTopic115EA044
[3/7] Mon Aug 06 2018 06:47:39 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::SNS::Subscription] AppTopicAppQueueSubscription2662E167
[3/7] Mon Aug 06 2018 06:47:39 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::SQS::QueuePolicy] AppQueuePolicyBD4F9387
[3/7] Mon Aug 06 2018 06:47:40 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::SQS::QueuePolicy] AppQueuePolicyBD4F9387 Resource creation Initiated
[3/7] Mon Aug 06 2018 06:47:40 GMT+0000 (Coordinated Universal Time)  CREATE_IN_PROGRESS  [AWS::SNS::Subscription] AppTopicAppQueueSubscription2662E167 Resource creation Initiated
[4/7] Mon Aug 06 2018 06:47:41 GMT+0000 (Coordinated Universal Time)  CREATE_COMPLETE     [AWS::SNS::Subscription] AppTopicAppQueueSubscription2662E167
[5/7] Mon Aug 06 2018 06:47:41 GMT+0000 (Coordinated Universal Time)  CREATE_COMPLETE     [AWS::SQS::QueuePolicy] AppQueuePolicyBD4F9387
[5/7] Mon Aug 06 2018 06:47:43 GMT+0000 (Coordinated Universal Time)  UPDATE_COMPLETE_CLEANUP_IN_PROGRESS  [AWS::CloudFormation::Stack] AppStack
[5/7] Mon Aug 06 2018 06:47:45 GMT+0000 (Coordinated Universal Time)  DELETE_IN_PROGRESS  [AWS::CloudFormation::WaitConditionHandle] WaitCondition
[6/7] Mon Aug 06 2018 06:47:46 GMT+0000 (Coordinated Universal Time)  DELETE_COMPLETE     [AWS::CloudFormation::WaitConditionHandle] WaitCondition
[7/7] Mon Aug 06 2018 06:47:46 GMT+0000 (Coordinated Universal Time)  UPDATE_COMPLETE     [AWS::CloudFormation::Stack] AppStack
 ☑️ Deployment of stack AppStack completed successfully, it has ARN arn:aws:cloudformation:ap-northeast-1:00000000000:stack/AppStack/xxxxxxxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxx

どうやらCFnのスタックとして作成されるっぽい。
確認してみるとあった。

f:id:y-ohgi:20180806221742p:plain

3. S3を増やしてみる

新しいパッケージをインストール

$ npm install @aws-cdk/aws-s3

s3パッケージをimportしてリソースを作成する。
importとオブジェクトをnewする行を追記

$ colordiff app.ts.old app.ts
3a4
> import s3 = require('@aws-cdk/aws-s3')
16a18,21
>
>         new s3.Bucket(this, 'MyFirstBucket', {
>             versioned: true
>         });

cdkでdiffをとってみる

$ npm run build
$ cdk diff

f:id:y-ohgi:20180806221754p:plain

s3が増えてる。 そのままdeploy

$ cdk deploy

f:id:y-ohgi:20180806221804p:plain CFnのコンソール見てみたら CREATE_IN_PROGRESS になってる

4. cdkコマンドからCFnテンプレートを吐き出す

cdk synth を試すのが今回の目的といっても過言ではない。
CFnテンプレートを吐き出せるらしい。やってみる。

$ cdk synth
Resources:
    AppQueueFD3F4958:
        Type: 'AWS::SQS::Queue'
        Properties:
            VisibilityTimeout: 300
    AppQueuePolicyBD4F9387:
        Type: 'AWS::SQS::QueuePolicy'
        Properties:
            PolicyDocument:
                Statement:
                    -
                        Action: 'sqs:SendMessage'
                        Condition:
                            ArnEquals:
                                'aws:SourceArn':
                                    Ref: AppTopic115EA044
                        Effect: Allow
                        Principal:
                            Service: sns.amazonaws.com
                        Resource:
                            'Fn::GetAtt':
                                - AppQueueFD3F4958
                                - Arn
                Version: '2012-10-17'
            Queues:
                -
                    Ref: AppQueueFD3F4958
    AppTopic115EA044:
        Type: 'AWS::SNS::Topic'
    AppTopicAppQueueSubscription2662E167:
        Type: 'AWS::SNS::Subscription'
        Properties:
            Endpoint:
                'Fn::GetAtt':
                    - AppQueueFD3F4958
                    - Arn
            Protocol: sqs
            TopicArn:
                Ref: AppTopic115EA044
    MyFirstBucketB8884501:
        Type: 'AWS::S3::Bucket'
        Properties:
            VersioningConfiguration:
                Status: Enabled
    CDKMetadata:
        Type: 'AWS::CDK::Metadata'
        Properties:
            Modules: '@aws-cdk/aws-cloudwatch=0.8.0,@aws-cdk/aws-kms=0.8.0,@aws-cdk/aws-s3=0.8.0,@aws-cdk/aws-sns=0.8.0,@aws-cdk/aws-sqs=0.8.0,@aws-cdk/cdk=0.8.0,@aws-cdk/cx-api=0.8.0,app=0.1.0,js-base64=2.4.5'

yamlが取得できた。

5. お片付け

$ cdk destroy

f:id:y-ohgi:20180806221814p:plain

aws-cdkが対応しているリソース

aws-cdk/packages/@aws-cdk から雑に引っ張ってきた
2018/08/06現在、ecsとかコード見ると動きそうになかったりするので今後対応予定のリソースリストになるのかなと

apigateway
applicationautoscaling
appsync
athena
autoscaling
autoscalingplans
batch
budgets
certificatemanager
cloud9
cloudformation
cloudfront
cloudtrail
cloudwatch
codebuild-codepipeline
codebuild
codecommit-codepipeline
codecommit
codedeploy
codepipeline
cognito
config
custom-resources
datapipeline
dax
directoryservice
dms
dynamodb
ec2
ecr
ecs
efs
eks
elasticache
elasticbeanstalk
elasticloadbalancing
elasticloadbalancingv2
elasticsearch
emr
events
gamelift
glue
guardduty
iam
inspector
iot
kinesis
kinesisanalytics
kinesisfirehose
kms
lambda-codepipeline
lambdaAdded
logs
neptune
opsworks
quickstarts
rds
redshift
route53
s3
sdb
serverless
servicecatalog
servicediscovery
ses
sns
sqs
ssm
stepfunctions
waf
wafregional
workspaces

所感

何に使うんじゃろ。
どうせCFnのスタック作成されちゃうならyaml書きたい人間。