AWS CDKさわってみる(インストールからCloudFormation出力まで)
「AWSのリソースをTypeScriptで定義できるらしい」という噂を聞いたので、早速触ってみました。 AWS CDKのインストール npmで配布されているので、npm i -gでインストールしましょう。 新規プロジェク […]
広告ここから
広告ここまで
目次
「AWSのリソースをTypeScriptで定義できるらしい」という噂を聞いたので、早速触ってみました。
AWS CDKのインストール
npmで配布されているので、npm i -g
でインストールしましょう。
$ npm i -g aws-cdk
$ cdk --version
0.13.0 (build bf73b09)
新規プロジェクト作成
新しくプロジェクトを始める場合は、cdk init
を実行します。
$ cdk init --help
/usr/local/opt/nvm/versions/node/v10.5.0/bin/cdk init [TEMPLATE]
オプション:
--app, -a REQUIRED: Command-line for executing your CDK app (e.g.
"node bin/my-app.js") [文字列]
--context, -c Add contextual string parameter. [配列]
--plugin, -p Name or path of a node package that extend the CDK
features. Can be specified multiple times [配列]
--rename Rename stack name if different then the one defined in
the cloud executable [文字列]
--trace Print trace for stack warnings [真偽]
--strict Do not construct stacks with warnings [真偽]
--ignore-errors Ignores synthesis errors, which will likely produce an
invalid output [真偽] [デフォルト: false]
--json, -j Use JSON output instead of YAML [真偽]
--verbose, -v Show debug logs [真偽]
--profile Use the indicated AWS profile as the default environment
[文字列]
--proxy Use the indicated proxy. Will read from HTTPS_PROXY
environment variable if not specified. [文字列]
--ec2creds, -i Force trying to fetch EC2 instance credentials. Default:
guess EC2 instance status. [真偽]
--version-reporting Disable insersion of the CDKMetadata resource in
synthesized templates [真偽]
--role-arn, -r ARN of Role to use when invoking CloudFormation [文字列]
--version バージョンを表示 [真偽]
--help ヘルプを表示 [真偽]
--language, -l the language to be used for the new project (default can
be configured in ~/.cdk.json)
[文字列] [選択してください: "dotnet", "java", "typescript"]
--list list the available templates [真偽]
TypeScript / Java / .NETの3つが使えるみたいですね。
$ cdk init -l 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 [email protected] No repository field.
npm WARN [email protected] 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
ディレクトリ構成です。
$ tree -I node_modules
.
├── README.md
├── bin
│ └── cdk.ts
├── cdk.json
├── package-lock.json
├── package.json
└── tsconfig.json
1 directory, 6 files
./bin/cdk.ts
にサンプルが用意されています。
#!/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 CdkStack extends cdk.Stack {
constructor(parent: cdk.App, name: string, props?: cdk.StackProps) {
super(parent, name, props);
const queue = new sqs.Queue(this, 'CdkQueue', {
visibilityTimeoutSec: 300
});
const topic = new sns.Topic(this, 'CdkTopic');
topic.subscribeQueue(queue);
}
}
const app = new cdk.App();
new CdkStack(app, 'CdkStack');
app.run();
CloudFormationに出力する
空き時間の都合でそろそろこの記事を締めたいので、最後にCloudFormationのテンプレートへ変換します。変換はcdk synth
で実行できます。cdk synth > template.yml
$ cdk synth
Resources:
CdkQueueBA7F247D:
Type: 'AWS::SQS::Queue'
Properties:
VisibilityTimeout: 300
CdkQueuePolicy9CB1D142:
Type: 'AWS::SQS::QueuePolicy'
Properties:
PolicyDocument:
Statement:
-
Action: 'sqs:SendMessage'
Condition:
ArnEquals:
'aws:SourceArn':
Ref: CdkTopic7E7E1214
Effect: Allow
Principal:
Service: sns.amazonaws.com
Resource:
'Fn::GetAtt':
- CdkQueueBA7F247D
- Arn
Version: '2012-10-17'
Queues:
-
Ref: CdkQueueBA7F247D
CdkTopic7E7E1214:
Type: 'AWS::SNS::Topic'
CdkTopicCdkQueueSubscriptionA1BA14FA:
Type: 'AWS::SNS::Subscription'
Properties:
Endpoint:
'Fn::GetAtt':
- CdkQueueBA7F247D
- Arn
Protocol: sqs
TopicArn:
Ref: CdkTopic7E7E1214
CDKMetadata:
Type: 'AWS::CDK::Metadata'
Properties:
Modules: >-
@aws-cdk/aws-cloudwatch=0.13.0,@aws-cdk/aws-iam=0.13.0,@aws-cdk/aws-kms=0.13.0,@aws-cdk/aws-s3-notifications=0.13.0,@aws-cdk/aws-sns=0.13.0,@aws-cdk/aws-sqs=0.13.0,@aws-cdk/cdk=0.13.0,@aws-cdk/cx-api=0.13.0,cdk=0.1.0
実際に利用する際はcdk synth > template.yml
のようにするとよいでしょう。
$ cdk synth > template.yml
$ aws cloudformation validate-template --template-body file://$(pwd)/template.yml
{
"Parameters": []
}
バリデーションもうまくいきましたね。