概要
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
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のスタックとして作成されるっぽい。
確認してみるとあった。
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
s3が増えてる。 そのままdeploy
$ cdk deploy
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
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書きたい人間。