Open6

AWS CDKを触ってみる

tetsuzawatetsuzawa

AWS CDK とは

https://aws.amazon.com/jp/cdk/

AWS Cloud Development Kit (AWS CDK) は、使い慣れたプログラミング言語を使用してクラウドアプリケーションリソースを定義するためのオープンソースのソフトウェア開発フレームワークです。

  • バックエンドでCloudFormationを使っている
  • TerraformやCloudFormaitionのようにプロビジョニングができるツールらしい。
  • 違いは.tfや.jsonで定義するのとは違い、プログラミング言語で記述できること。したがって、表現力が高い。
    • オブジェクト、ループ、条件といった使い慣れた機能により開発プロセスを加速できます。

  • 対応言語
    • TypeScript
    • JavaScript
    • Python
    • Java
    • C#
    • Go (開発中)
  • cdk自体はベースがTypeScriptで開発されていて、JSIIを使って多言語のバインディングを生成してるらしい
tetsuzawatetsuzawa

Bootstrapping

順番が上下しちゃったけどBootstrapingをやる。

Bootstrappingとは

  • CDKがデプロイを実行するためには必要なリソースをプロビジョニングしなければならないことがある。
    • ローカルのファイル、Dockerイメージを使う場合
    • CloudFormationのテンプレートが50kbを超える場合
    • もう一つはまだ理解できなかったのでdocument参照 mm
  • リソースとは、ファイルを保存するためのS3バケットやIAMロールなどがある。
  • これらをプロビジョニングすることをBootstrappingという。
  • これらのリソースはCDKToolkitという名前でCloudFormationスタックで定義される。

やってみる

次を実行。

$ cdk bootstrap aws://<ACCOUNT-NUMBER>/<REGION>
 ⏳  Bootstrapping environment aws://<ACCOUNT-NUMBER>/<REGION>
CDKToolkit: creating CloudFormation changeset...
[██████████████████████████████████████████████████████████] (3/3)



 ✅  Environment aws://<ACCOUNT-NUMBER>/<REGION> bootstrapped.

awsのprofileが設定されているならcdk bootstrap --profile <PROFILE_NAME>でもOK

ちなみにcdk bootstrap --show-template > bootstrap-template.yamlをするとCloudFormationのテンプレートを見ることができる。

また、現時点ではlegacyバージョンのテンプレートが使用されるらしい。modernバージョンのテンプレートを使うにはexport CDK_NEW_BOOTSTRAP=1する。違いはdocument参照。

tetsuzawatetsuzawa

Getting Started続き

まず、cdk initでプロジェクトの雛形を作成。

$ cdk init app --language typescript

すると、いくつかのファイルが生成される。

$ tree -a -L 1
.
├── .git
├── .gitignore
├── .npmignore
├── README.md
├── bin
├── cdk.json
├── cdk.out
├── jest.config.js
├── lib
├── node_modules
├── package-lock.json
├── package.json
├── test
└── tsconfig.json
6 directories, 8 files

ビルドしてみる。

$ npm run build

> getting-started@0.1.0 build
> tsc
$ cdk ls
GettingStartedStack

初期状態ではGettingStartedStackが生成されてるみたい。

tetsuzawatetsuzawa

s3を追加してみる

まずライブラリを追加。

npm install @aws-cdk/aws-s3

次にlib/getting-started-stack.tsを書き換える。

lib/getting-started-stack.ts
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';

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

    new s3.Bucket(this, 'MyFirstBucket', {
      versioned: true
    });
  }
}

s3.Bucket()はscope, id, propsの3つの引数を取る。

  • scope
    • scopeを理解するにはApp, Stack, Constructを理解する必要がある。
    • これはDevelopersIOのAWS CDK の3種類の Construct を使ってデプロイしてみたが詳しい
    • 簡単にいうとリソースを木構造で表すことができる。
    • ここではBucketの親がGettingStartedStackであることを示している。
  • id
    • AWSのリソースを一意に表すもの(名前は後述のbucketNameプロパティで指定できる)
  • props
    • バケットのプロパティ

synth

cdk synthを実行することでCloudFormationのテンプレートが合成される。
また、同じものがcdk.outに書き込まれる。

$ cdk synth
Resources:
  MyFirstBucketB8884501:
    Type: AWS::S3::Bucket
    Properties:
      VersioningConfiguration:
        Status: Enabled
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Metadata:
      aws:cdk:path: GettingStartedStack/MyFirstBucket/Resource
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Analytics: v2:deflate64:H4sIAAAAAAAAEyWNSwrDMAxEz9K9o8T0sy7NDdITBFkFx1QCS24XxnfPbzUP5g3jwQ93GC7P+a8dhtRXlExQ3zZjcqOwWi5obvzwRColI+28FSFaFG5uH+oV6qtgokM8qTXHEggW7X/+Bv6xvSwaY5cLW/wSTGeuOl0jXIIAAAA=
    Metadata:
      aws:cdk:path: GettingStartedStack/CDKMetadata/Default
    Condition: CDKMetadataAvailable
Conditions:
  CDKMetadataAvailable:
    Fn::Or:
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - af-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-1
/* ... */

ここで生成されるCloudFormaition テンプレートは適用可能なもの。
問題があればエラーがでる。

tetsuzawatetsuzawa

deploy

cdk deployコマンドを打つと、実際にAWS上にリソースが作成される。

$ cdk deploy
GettingStartedStack: deploying...
GettingStartedStack: creating CloudFormation changeset...
[██████████████████████████████████████████████████████████] (3/3)





 ✅  GettingStartedStack

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789123:stack/GettingStartedStack/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

正常終了していればCloudFormationとS3が作成されているはずである。

AWS CloudFormation コンソール