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": []
    }

    バリデーションもうまくいきましたね。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark