Slide 1

Slide 1 text

AWS CDK 入門

Slide 2

Slide 2 text

石澤直人 Work @heptagon-inc Github: @youyo Twitter: @youyo_ Nuxt.js でブログ作りながらフロントエンドの勉強 しているインフラエンジニア https://blog.youyo.io/

Slide 3

Slide 3 text

祝! AWS CDK GA

Slide 4

Slide 4 text

AWS CDK とは? AWS Cloud Development Kit AWS リソースをプログラミング言語で記述し, モデル化お よびプロビジョニングするためのフレームワーク TypeScript とPython をサポート (TypeScript >= 2.7, Python >= 3.6) TypeScript やPython で記述し, Cloudformation テンプレー トを生成して実行する 型がありIDE 等による補完が効く ref; https://aws.amazon.com/jp/blogs/news/aws-cloud- development-kit-cdk-typescript-and-python-are-now- generally-available/

Slide 5

Slide 5 text

とりあえずS3 バケット作ってみる

Slide 6

Slide 6 text

インストール node.js 環境が必要 npm でインストール $ npm install -g aws-cdk $ cdk --version 1.0.0 (build d89592e)

Slide 7

Slide 7 text

初期テンプレ作成 $ cdk init --language python Applying project template app for python Executing Creating virtualenv... # Welcome to your CDK Python project! . . . # Useful commands * `cdk ls` list all stacks in the app * `cdk synth` emits the synthesized CloudFormation templa * `cdk deploy` deploy this stack to your default AWS accou * `cdk diff` compare deployed stack with current state * `cdk docs` open CDK documentation Enjoy!

Slide 8

Slide 8 text

実行する際のディレクトリにファイルとかあると エラー吐くので注意 $ cdk init --language python `cdk init` cannot be run in a non-empty directory! Lambda Function を扱ったりテンプレートサイズが 大きくなってくるとデプロイにS3 バケットが必要 になってくるので, その場合はcdk bootstrap でバケ ット作成しておく $ cdk bootstrap

Slide 9

Slide 9 text

適当にコード書いて実行してみる from aws_cdk import ( core, aws_s3 as s3 ) class AppStack(core.Stack): def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) s3.Bucket(self, 'my-bucket') app = core.App() AppStack(app, "my-stack") app.synth()

Slide 10

Slide 10 text

差分をチェックしてみる $ cdk diff Stack my-stack Resources [+] AWS::S3::Bucket my-bucket mybucket15D133BF

Slide 11

Slide 11 text

デプロイしてみる $ cdk deploy my-stack: deploying... my-stack: creating CloudFormation changeset... 0/3 | 14:31:26 | CREATE_IN_PROGRESS | AWS::CDK::Metadata | CD 0/3 | 14:31:26 | CREATE_IN_PROGRESS | AWS::S3::Bucket | my 0/3 | 14:31:28 | CREATE_IN_PROGRESS | AWS::S3::Bucket | my 0/3 | 14:31:28 | CREATE_IN_PROGRESS | AWS::CDK::Metadata | CD 1/3 | 14:31:28 | CREATE_COMPLETE | AWS::CDK::Metadata | CD 2/3 | 14:31:49 | CREATE_COMPLETE | AWS::S3::Bucket | my 3/3 | 14:31:50 | CREATE_COMPLETE | AWS::CloudFormation::St ✅ my-stack Stack ARN: arn:aws:cloudformation:ap-northeast-1:380421963481:stack/my-stac

Slide 12

Slide 12 text

変更加えてみる from aws_cdk import ( core, aws_s3 as s3 ) class AppStack(core.Stack): def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) s3.Bucket(self, 'my-bucket', encryption=s3.BucketEncryption.S3_MANAGED, versioned=True ) app = core.App() AppStack(app, "my-stack") app.synth()

Slide 13

Slide 13 text

$ cdk diff Stack my-stack Resources [~] AWS::S3::Bucket my-bucket mybucket15D133BF ├─ [+] BucketEncryption │ └─ {"ServerSideEncryptionConfiguration":[ │ {"ServerSideEncryptionByDefault":{ │ "SSEAlgorithm":"AES256"}}]} └─ [+] VersioningConfiguration └─ {"Status":"Enabled"} $ cdk deploy my-stack: deploying... my-stack: creating CloudFormation changeset... 0/2 | 15:23:43 | UPDATE_IN_PROGRESS | AWS::S3::Bucket | my 1/2 | 15:24:05 | UPDATE_COMPLETE | AWS::S3::Bucket | my ✅ my-stack Stack ARN: arn:aws:cloudformation:ap-northeast-1:380421963481:stack/my-stac

Slide 14

Slide 14 text

これをCloudformation(yaml) で記述しようとすると どうなるのか? $ cdk synth Resources: mybucket15D133BF: Type: AWS::S3::Bucket Properties: BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 VersioningConfiguration: Status: Enabled UpdateReplacePolicy: Retain DeletionPolicy: Retain Metadata: aws:cdk:path: my-stack/my-bucket/Resource CDKMetadata: Type: AWS::CDK::Metadata Properties: Modules: aws-cdk=1.0.0,@aws-cdk/aws-events=1.0.0,@aws-cdk/aws-iam=

Slide 15

Slide 15 text

どっちがお好きですか? s3.Bucket(self, 'my-bucket', encryption=s3.BucketEncryption.S3_MANAGED, versioned=True ) mybucket15D133BF: Type: AWS::S3::Bucket Properties: BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 VersioningConfiguration: Status: Enabled UpdateReplacePolicy: Retain DeletionPolicy: Retain

Slide 16

Slide 16 text

Cloudformation やAWS SAM, Serverless Framework, Terraform などの他のツールも存在する。どう選択する か? 基本的に好きなものを使えばいいじゃんというスタンス Cloudformation はマルチリージョンの扱いに難があった が, AWS CDK では特に問題なさそうなのでマルチリージョ ン扱いそうなときはAWS CDK かTerraform を使うと思う AWS CDK ではまだ稀にできないことがあったりする。 (ex; db.r5.* などのR5 インスタンスタイプを選択できなか ったり) そういうときはAWS SAM やTerraform を使うと思う。 AWS CDK は独自DSL 覚えなくていいのでいいよね。

Slide 17

Slide 17 text

でもTerraform でLambda Function 扱うのとかめんどくさ い。というかAWS SAM が超絶楽。AWS CDK もいい感じ。 なのでLambda Function 扱うときはAWS SAM かAWS CDK を使うと思う。 でもTerraform 使いたい熱も最近高いのでTerraform と AWS SAM 組み合わせて使うかも。 ref; https://blog.youyo.io/posts/terraform-aws-sam Serverless Framework はプラグインでいろいろ機能拡張 できるしそういうのが必要なときは使うかも。 型があるって素晴らしいね!AWS CDK ! Terraform もv0.12 ですごく良くなったよ! とりあえず今の気持ちとしてはAWS CDK いい感じなので 積極的に使っていきたい

Slide 18

Slide 18 text

使ってみた https://github.com/heptagon-inc/r53rw

Slide 19

Slide 19 text

まとめ AWS CDK は個人的にはおすすめ 一つのツールにこだわらずに適材適所で使い分け て好きなものを使ったらいい https://cdkworkshop.com/ ここを一通りやるとCDK チョットデキルになれるかも cdk docs コマンドが最高! ドキュメントページを探す手間が省ける! $ cdk docs https://docs.aws.amazon.com/cdk/api/latest/