Help us understand the problem. What is going on with this article?

CDKを試してみる

AWS クラウド開発キット (CDK) – TypeScript と Python 用がご利用可能に

これを触ってみます。

早速、嵌りました。グローバルにインストールするのが屋だったので、ローカルにnpm install aws-cdkでインストールすると、cdkが使えませんでした(なんで?)。仕方なくグローバルインストール。

C:\Users\User\aws\cdk>npm install -g aws-cdk
C:\Users\User\AppData\Roaming\npm\cdk -> C:\Users\User\AppData\Roaming\npm\node_modules\aws-cdk\bin\cdk

> core-js@2.6.10 postinstall C:\Users\User\AppData\Roaming\npm\node_modules\aws-cdk\node_modules\core-js
> node postinstall || echo "ignore"

Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon:
> https://opencollective.com/core-js
> https://www.patreon.com/zloirock

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)

+ aws-cdk@1.14.0
added 237 packages from 218 contributors in 23.957s

C:\Users\User\aws\cdk>

コマンドの確認します。

C:\Users\User\aws\cdk>cdk
Usage: cdk -a <cdk-app> COMMAND

Commands:
  cdk list [STACKS..]             Lists all stacks in the app      [aliases: ls]
  cdk synthesize [STACKS..]       Synthesizes and prints the CloudFormation
                                  template for this stack       [aliases: synth]
  cdk bootstrap [ENVIRONMENTS..]  Deploys the CDK toolkit stack into an AWS
                                  environment
  cdk deploy [STACKS..]           Deploys the stack(s) named STACKS into your
                                  AWS account
  cdk destroy [STACKS..]          Destroy the stack(s) named STACKS
  cdk diff [STACKS..]             Compares the specified stack with the deployed
                                  stack or a local template file, and returns
                                  with status 1 if any difference is found
  cdk metadata [STACK]            Returns all metadata associated with this
                                  stack
  cdk init [TEMPLATE]             Create a new, empty CDK project from a
                                  template. Invoked without TEMPLATE, the app
                                  template will be used.
  cdk context                     Manage cached context values
  cdk docs                        Opens the reference documentation in a browser
                                                                  [aliases: doc]
  cdk doctor                      Check your set-up for potential problems

Options:
  --app, -a             REQUIRED: command-line for executing your app or a cloud
                        assembly directory (e.g. "node bin/my-app.js")  [string]
  --context, -c         Add contextual string parameter (KEY=VALUE)      [array]
  --plugin, -p          Name or path of a node package that extend the CDK
                        features. Can be specified multiple times        [array]
  --trace               Print trace for stack warnings                 [boolean]
  --strict              Do not construct stacks with warnings          [boolean]
  --ignore-errors       Ignores synthesis errors, which will likely produce an
                        invalid output                [boolean] [default: false]
  --json, -j            Use JSON output instead of YAML when templates are
                        printed to STDOUT             [boolean] [default: false]
  --verbose, -v         Show debug logs               [boolean] [default: false]
  --profile             Use the indicated AWS profile as the default environment
                                                                        [string]
  --proxy               Use the indicated proxy. Will read from HTTPS_PROXY
                        environment variable if not specified.          [string]
  --ec2creds, -i        Force trying to fetch EC2 instance credentials. Default:
                        guess EC2 instance status.                     [boolean]
  --version-reporting   Include the "AWS::CDK::Metadata" resource in synthesized
                        templates (enabled by default)                 [boolean]
  --path-metadata       Include "aws:cdk:path" CloudFormation metadata for each
                        resource (enabled by default)  [boolean] [default: true]
  --asset-metadata      Include "aws:asset:*" CloudFormation metadata for
                        resources that user assets (enabled by default)
                                                       [boolean] [default: true]
  --role-arn, -r        ARN of Role to use when invoking CloudFormation [string]
  --toolkit-stack-name  The name of the CDK toolkit stack               [string]
  --staging             Copy assets to the output directory (use --no-staging to
                        disable, needed for local debugging the source files
                        with SAM CLI)                  [boolean] [default: true]
  --output, -o          Emits the synthesized cloud assembly into a directory
                        (default: cdk.out)                              [string]
  --no-color            Removes colors and other style from console output
                                                      [boolean] [default: false]
  --version             Show version number                            [boolean]
  -h, --help            Show help                                      [boolean]

If your app has a single stack, there is no need to specify the stack name

If one of cdk.json or ~/.cdk.json exists, options specified there will be used
as defaults. Settings in cdk.json take precedence.


C:\Users\User\aws\cdk>

初期化を行います。言語はtypescriptにしました(フォルダの名前をcdk->cdk01に変えています)。

C:\Users\User\aws>cd cdk01

C:\Users\User\aws\cdk01>cdk init app --language=typescript
Applying project template app for typescript
Initializing a new git repository...
warning: LF will be replaced by CRLF in .gitignore.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in .npmignore.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in README.md.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in bin/cdk01.ts.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in cdk.json.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in jest.config.js.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in lib/cdk01-stack.ts.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in package.json.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in test/cdk01.test.ts.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in tsconfig.json.
The file will have its original line endings in your working directory.
Executing npm install...
npm WARN deprecated left-pad@1.3.0: use String.prototype.padStart()
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN cdk01@0.1.0 No repository field.
npm WARN cdk01@0.1.0 No license field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

# Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `npm run test`    perform the jest unit tests
 * `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


C:\Users\User\aws\cdk01>cdk init app --language=typescript

プロジェクトの構造の確認します(init直後ではなく、手でフォルダやファイルの追加があります)。

長いのでgistに貼っています。
CDK project structure

init後のlib\cdk01-stack.tsファイルを確認します。// The code that defines your stack goes hereとある場所にコードを書いてくようです。

import cdk = require('@aws-cdk/core');
export class Cdk01Stack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
  }
}

サンプルのコードを追加します。

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

export class Cdk01Stack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here

    const myVpc = new ec2.Vpc(this, "MyVPC");

    const myCluster = new ecs.Cluster(this, "MyCluster", {
      vpc: myVpc
    });

    const myQueueProcessingService = new ecs_patterns.QueueProcessingFargateService(
      this, "MyQueueProcessingService", {
        cluster: myCluster,
        memoryLimitMiB: 512,
        image: ecs.ContainerImage.fromAsset("my-queue-consumer")
      });

    const myFunction = new lambda.Function(
      this, "MyFrontendFunction", {
        runtime: lambda.Runtime.NODEJS_10_X,
        timeout: Duration.seconds(3),
        handler: "index.handler",
        code: lambda.Code.asset("my-front-end"),
        environment: {
          QUEUE_NAME: myQueueProcessingService.sqsQueue.queueName
        }
      });

    myQueueProcessingService.sqsQueue.grantSendMessages(myFunction);

    const myApi = new apigateway.LambdaRestApi(
      this, "MyFrontendApi", {
        handler: myFunction
      });

  }
}

デプロイするつもりはないので、cdk synthを使って、cloud formationのファイルを生成します。
が、さっそくコンパイルエラーです。

C:\Users\User\aws\cdk01>cdk synth
⨯ Unable to compile TypeScript:
lib/cdk01-stack.ts:9:23 - error TS2304: Cannot find name 'ec2'.

9     const myVpc = new ec2.Vpc(this, "MyVPC");
                        ~~~
lib/cdk01-stack.ts:11:27 - error TS2304: Cannot find name 'ecs'.

11     const myCluster = new ecs.Cluster(this, "MyCluster", {
                             ~~~
lib/cdk01-stack.ts:15:42 - error TS2304: Cannot find name 'ecs_patterns'.

15     const myQueueProcessingService = new ecs_patterns.QueueProcessingFargateService(
                                            ~~~~~~~~~~~~
lib/cdk01-stack.ts:19:16 - error TS2304: Cannot find name 'ecs'.

19         image: ecs.ContainerImage.fromAsset("my-queue-consumer")
                  ~~~
lib/cdk01-stack.ts:22:28 - error TS2304: Cannot find name 'lambda'.

22     const myFunction = new lambda.Function(
                              ~~~~~~
lib/cdk01-stack.ts:24:18 - error TS2304: Cannot find name 'lambda'.

24         runtime: lambda.Runtime.NODEJS_10_X,
                    ~~~~~~
lib/cdk01-stack.ts:25:18 - error TS2304: Cannot find name 'Duration'.

25         timeout: Duration.seconds(3),
                    ~~~~~~~~
lib/cdk01-stack.ts:27:15 - error TS2304: Cannot find name 'lambda'.

27         code: lambda.Code.asset("my-front-end"),
                 ~~~~~~
lib/cdk01-stack.ts:35:23 - error TS2304: Cannot find name 'apigateway'.

35     const myApi = new apigateway.LambdaRestApi(
                         ~~~~~~~~~~

Subprocess exited with error 1

必要なモジュールが足りないようです。地道にモジュールを追加します。npm iiはinstallのiのようです。

C:\Users\User\aws\cdk01>npm i @aws-cdk/aws-ecs
npm WARN cdk01@0.1.0 No repository field.
npm WARN cdk01@0.1.0 No license field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

+ @aws-cdk/aws-ecs@1.14.0
added 30 packages from 4 contributors and audited 1762575 packages in 26.75s
found 0 vulnerabilities

ファイルにimportを追加します。(TypeScriptのモジュールDurationの追加がわからなかったので、コメントアウトがあります。誰か教えて!)

import cdk = require('@aws-cdk/core');
import ec2 = require('@aws-cdk/aws-ec2');
import ecs = require('@aws-cdk/aws-ecs');
import lambda = require('@aws-cdk/aws-lambda');
import ecs_patterns = require('@aws-cdk/aws-ecs-patterns');
import apigateway = require('@aws-cdk/aws-apigateway');

export class Cdk01Stack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here

    const myVpc = new ec2.Vpc(this, "MyVPC");

    const myCluster = new ecs.Cluster(this, "MyCluster", {
      vpc: myVpc
    });

    const myQueueProcessingService = new ecs_patterns.QueueProcessingFargateService(
      this, "MyQueueProcessingService", {
        cluster: myCluster,
        memoryLimitMiB: 512,
        image: ecs.ContainerImage.fromAsset("my-queue-consumer")
      });

    const myFunction = new lambda.Function(
      this, "MyFrontendFunction", {
        runtime: lambda.Runtime.NODEJS_10_X,
        // timeout: Duration.seconds(3),
        handler: "index.handler",
        code: lambda.Code.asset("my-front-end"),
        environment: {
          QUEUE_NAME: myQueueProcessingService.sqsQueue.queueName
        }
      });

    myQueueProcessingService.sqsQueue.grantSendMessages(myFunction);

    const myApi = new apigateway.LambdaRestApi(
      this, "MyFrontendApi", {
        handler: myFunction
      });

  }
}

キューの作成でエラーになるので、フォルダを追加します。

C:\Users\User\aws\cdk01>cdk synth
Cannot find image directory at C:\Users\User\aws\cdk01\my-queue-consumer
Subprocess exited with error 1

C:\Users\User\aws\cdk01>mkdir my-queue-consumer

再度チャレンジ

C:\Users\User\aws\cdk01>cdk synth
No 'Dockerfile' found in C:\Users\User\aws\cdk01\my-queue-consumer
Subprocess exited with error 1

Dockerfileがないとのこと。なので、適当につくる。

再度チャレンジ

C:\Users\User\aws\cdk01>cdk synth
ENOENT: no such file or directory, stat 'C:\Users\User\aws\cdk01\my-front-end'
Subprocess exited with error 1

C:\Users\User\aws\cdk01>mkdir my-queue-consumer

また、フォルダがないとのこと。とりあえず作る。my-front-endでなんでフォルダが必要なのだろう?

再度チャレンジ

C:\Users\User\aws\cdk01>cdk synth
Resources:
  MyVPCAFB07A31:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: Cdk01Stack/MyVPC

以下省略

生成されたファイル

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away