Save 37% off PRO during our Black Friday Sale! »

Get started AWS CDK

C9cacb1d0e96ab27dcb045177068820c?s=47 youyo
July 19, 2019

Get started AWS CDK

AWS CDK入門

C9cacb1d0e96ab27dcb045177068820c?s=128

youyo

July 19, 2019
Tweet

Transcript

  1. AWS CDK 入門

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

    https://blog.youyo.io/
  3. 祝! AWS CDK GA

  4. 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/
  5. とりあえずS3 バケット作ってみる

  6. インストール node.js 環境が必要 npm でインストール $ npm install -g aws-cdk

    $ cdk --version 1.0.0 (build d89592e)
  7. 初期テンプレ作成 $ 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!
  8. 実行する際のディレクトリにファイルとかあると エラー吐くので注意 $ cdk init --language python `cdk init` cannot

    be run in a non-empty directory! Lambda Function を扱ったりテンプレートサイズが 大きくなってくるとデプロイにS3 バケットが必要 になってくるので, その場合はcdk bootstrap でバケ ット作成しておく $ cdk bootstrap
  9. 適当にコード書いて実行してみる 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()
  10. 差分をチェックしてみる $ cdk diff Stack my-stack Resources [+] AWS::S3::Bucket my-bucket

    mybucket15D133BF
  11. デプロイしてみる $ 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
  12. 変更加えてみる 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()
  13. $ 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
  14. これを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=
  15. どっちがお好きですか? 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
  16. Cloudformation やAWS SAM, Serverless Framework, Terraform などの他のツールも存在する。どう選択する か? 基本的に好きなものを使えばいいじゃんというスタンス Cloudformation

    はマルチリージョンの扱いに難があった が, AWS CDK では特に問題なさそうなのでマルチリージョ ン扱いそうなときはAWS CDK かTerraform を使うと思う AWS CDK ではまだ稀にできないことがあったりする。 (ex; db.r5.* などのR5 インスタンスタイプを選択できなか ったり) そういうときはAWS SAM やTerraform を使うと思う。 AWS CDK は独自DSL 覚えなくていいのでいいよね。
  17. でも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 いい感じなので 積極的に使っていきたい
  18. 使ってみた https://github.com/heptagon-inc/r53rw

  19. まとめ AWS CDK は個人的にはおすすめ 一つのツールにこだわらずに適材適所で使い分け て好きなものを使ったらいい https://cdkworkshop.com/ ここを一通りやるとCDK チョットデキルになれるかも cdk

    docs コマンドが最高! ドキュメントページを探す手間が省ける! $ cdk docs https://docs.aws.amazon.com/cdk/api/latest/