Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS CDKで Infrastructure as Code インフラの構築・改善をもっと早く!

D90a5143f16f9b27bef934aabf63ed59?s=47 Kato Ryo
January 25, 2021

AWS CDKで Infrastructure as Code インフラの構築・改善をもっと早く!

July Tech Festa 2021 Winter 推しテク総選挙

D90a5143f16f9b27bef934aabf63ed59?s=128

Kato Ryo

January 25, 2021
Tweet

Transcript

  1. AWS CDKで Infrastructure as Code インフラの構築・改善をもっと早く! クラスメソッド株式会社 加藤 諒 July Tech

    Festa 2021w #推しテク総選挙
  2. 自己紹介 • ロール ◦ オンプレインフラ → AWSインフラ → バックエンドエンジニア •

    業務形態 ◦ 受託開発/コンサルティング • プログラミング言語 ◦ TypeScript(Node.js)/Python/Go • AWS ◦ API Gateway/Lambda/DynamoDB (Severless) ◦ ALB/ECS/RDS (Container) • フェイズ ◦ 設計〜初期開発(PoC) 加藤 諒 バックエンドエンジニア クラスメソッド株式会社
  3. 主な視聴者の想定 AWSを使ってインフラ構築・開発をしている プログラミングができる(習得する気がある) CloudFormationやTerraformを使ったことがある

  4. インフラに求めるモノ Infrastructure as Codeで 解決したいコト

  5. あるべきAWSインフラの姿 容易に設定されている内容を確認できる 簡単に構成の変更や機能の追加が行える 必要に応じて環境(dev, stg, prd)を複製できる 負荷に応じてスケールし攻撃を自動でブロックする かかっているコストを可視化できる

  6. Infrastructure as Codeが解決するもの 容易に設定されている内容を確認できる 簡単に構成の変更や機能の追加が行える 必要に応じて環境(dev, stg, prd)を複製できる 負荷に応じてスケールし攻撃を自動でブロックする かかっているコストを可視化できる

  7. Infrastructure as Codeは どのように課題を解決するのか コードから構成を知ることができる 同じコードを使えば何個でも構成で作成できる Git・ツールで差分を簡単に検知できる

  8. AWS Cloud Development Kit(CDK) とは

  9. AWS CDK 概要 Deploy Synthesis

  10. AWS CDKの特徴 ベストプラクティス込みのライブラリ(Construct)を使用 使い慣れたプログラミング言語、ツールの使用 インフラとランタイムコードを一緒にデプロイ 開発者にやさしいコマンドラインインターフェイス AWS CloudFormationの使用

  11. AWS CDKが対応している言語 10.13.0 <= Node.js
 ⚠13.0.0〜13.6.0はNG
 3.6 <= Python
 .NET

    Core <= 3.1
 8 <= Java
 Maven <= 3.5.4

  12. User’s Application JSii ランタイムアーキテクチャ Operating System JVM/.NET/... Host jsii Runtime

    Generated Bindings node (Child Process) STDIN STDOUT @jsii/runtime @jsii/kernel LibA LibB . JSON
  13. 開発環境のセットアップ CDK CLIの使い方

  14. AWS CDKのインストール npm -g install aws-cdk ブートストラップ処理(AWSアカウント&リージョン毎に1回だけ) cdk bootstrap aws://${AWS_ACCOUNT}/${AWS_REGION}

    セットアップ
  15. CloudFormationテンプレートの生成 cdk synth スタックとローカルの比較 cdk diff スタックのデプロイ cdk deploy スタックの破棄

    cdk destroy CDK CLIの基本操作
  16. TypeScriptのテンプレートの生成 cdk init app --language typescript TypeScriptのテンプレートの生成(サンプルアプリ付) cdk init sample-app

    --language typescript TypeScriptのライブラリテンプレートの生成 cdk init lib --language typescript CDK CLIでテンプレート生成
  17. CDK CLIは ~/.aws/credentials と ~/.aws/config を参照する 1. --profileを指定した場合 パラメータregionの指定も必須 2.

    環境変数 環境変数AWS_DEFAULT_REGIONのの指定も必須 3. デフォルトプロファイル パラメータregionの指定も必須 CDK CLIが使用する認証情報
  18. デモンストレーション 1 S3 バケットの作成

  19. None
  20. None
  21. AWS CDK Constructs

  22. AWS CDK Constructs • App ◦ CDKの全体を表す ◦ 構成ツリーのルート •

    Stack ◦ デプロイのスコープ ◦ CFnのStackと同じ • Resouce ◦ 1つまたは複数のAWSリソース ◦ 再利用・共有が可能
  23. Constructの パラメータ • scope: Construct ◦ 親Construct ◦ thisで渡すのが一般的 •

    id: string ◦ scope内で一意なID ◦ 物理名の一部に使われる • props: XXX ◦ 各Construct毎に固有
  24. 独自のConstructを 作る 1. Constructクラスを継承してクラス を作る 2. propsを定義する 3. Resourcesを定義する 4.

    Resourcesを結合/設定変更する 5. Resourcesをプロパティにする
  25. AWS Construct Library • 定義済みのResource Construct がCDKには含まれている • パラメータの指定だけで機能する •

    独自Constructで再利用できる
  26. AWS Construct Libraryのレベル

  27. AWS CDK Other Concepts

  28. Environments # cdk synth UndefinedEnvStack Cannot retrieve value from context

    provider vpc-provider since account/region are not specified at the stack level. Either configure "env" with explicit account and region when you define your stack, or use the environment variables "CDK_DEFAULT_ACCOUNT" and "CDK_DEFAULT_REGION" to inherit environment information from the CLI (not recommended for production stacks)
  29. インスタンスに使用するAMI IDやデプロイ先の既存VPCのIDをキャッシュする 仕組み Context

  30. AssetはAWS CDK アプリとバンドルできるローカルファイル、ディレクトリ、 Docker Image プロジェクト内で管理するランタイムコードをデプロイのためにS3、ECRにアッ プロードする仕組み • Asset Type

    ◦ Amazon S3 Asset ◦ Docker Image Asset Asset
  31. Amazon S3 Asset(Lambda) Docker Image Asset(ECS) Asset

  32. Asset (Bundling Asset Code) lambda.Code.fromAssetメソッドを使う 時に任意のコマンドをDocker上で実行 可能 TSのトランスコンパイル、パッケージのバ ンドル処理に便利

  33. Tagging Tags.of()メソッドにConstruct与えて配下 すべてのタグを制御する Tags.of(SCOPE).add(‘key’, ‘value’) Tags.of(SCOPE).remove(‘key’) Tags.of(SCOPE).add(‘key’, ‘value’, { priority:

    300 })
  34. Constructsのテスト

  35. @aws-cdk/assert

  36. • Snapshot test ◦ 生成されるテンプレートに変化が無いかテストする • Fine-grained test ◦ AWSリソースが想定されるパラメータかテストする

    • Validation test ◦ Constructがpropsに対して正常にバリデーションするか Test types
  37. Construct全体に対してSnapshot test 
 意図したパラメータになっているか Fine-grained test
 期待する例外が投げられるか 
 Validation test


    意図したパラメータになっているか Fine-grained test

  38. 私がAWS CDKを推す理由


  39. • 型が有る
 ◦ これ文字列?数値?真偽値?で悩まなく良い
 • バージョンやランタイム表記に悩まなくて良い
 ◦ Lambdaのランタイムは node.js12? node.js

    12? node.js12.x?
 • プロパティの階層がわかる
 ◦ エディタの補完を見ればネストがあっても怖くない
 いちいちエディタとリファレンスを
 往復しなくて良い

  40. • TypeScriptで全部書ける
 ◦ インフラ(CDK), バックエンド(Lambda), フロントエンド(React)
 • 単一リポジトリで管理できる
 ◦ Yarn

    workspace機能(eslint, tsconfigなどは個別管理できる)
 ◦ 単一のユースケースに対して複数PR作成しなくて良い
 • 脳のコンテキストスイッチが減る
 ◦ 同じ言語、同じテストライブラリが使える
 TypeScriptでインフラ〜フロントエンドまで
 全部書ける!!

  41. • Lambdaのバンドル処理をCDKで管理できる
 ◦ Makefileやデプロイスクリプトから解放される
 • IAMポリシーを自動生成してくれる
 ◦ 最小権限ポリシーで管理しても破綻しない
 • 冗長な記述をしなくて良い


    ◦ L2 Constructのサポートが強力
 ◦ LambdaとAPIの関連付けなどの処理をConstruct化できる
 サーバーレス開発がしやすい⚡

  42. 【付録】 CDKに関連するツール

  43. • このツールで何が出来るか? ◦ AWS CDKプロジェクトを継続的に管理できる(deps, tsconfig, jest, eslist, github workflow,

    ...) • CDKを使用して!? ◦ CDKはプログラミング言語を使い何かを生成するアプローチなので CFnテンプレート以外も出力可能 • CDK以外にも色々対応しているがprojen自体がalpha版 ◦ Next.js, React, Java, ... projen - CDKを使用してプロジェクトを管理 - https://github.com/projen/projen
  44. • このツールで何が出来るか? ◦ CDKでK8S Manifest YAMLを生成できる • 少ない記述でManifest YAMLを生成できる ◦

    L1、L2(cdk8s+)が提供されている • @aws-cdk/aws-eksとCDK8sはネイティブに連携可能 ◦ CDKで作ったS3バケット名 → Manifest YAML ◦ Manifest YAML → CDKで作ったEKS Cluster CDK8s - CDKを使用してKubernetesを管理 - https://github.com/awslabs/cdk8s
  45. • このツールで何が出来るか? ◦ CDKでTerraformを生成できる • 様々なクラウドやSaaSを管理できる ◦ AWS, GCP, Azure,

    GitHub, Kubernetes, … • Terraformのメリットを引き継げる ◦ Provision workflow(plan→apply→destory) ◦ Import CDKtf - CDKを使用してTerraformを生成 - https://github.com/hashicorp/terraform-cdk
  46. 【付録】 参考リンク

  47. AWS公式ドキュメント https://docs.aws.amazon.com/cdk/latest/guide/home.html CDK Workshop https://cdkworkshop.com AWS CDK Primer(無償のE-learning) https://www.aws.training/Details/eLearning?id=64510 CDK

    API Reference https://docs.aws.amazon.com/cdk/api/latest/docs/aws-construct-library.html CDK Patterns https://cdkpatterns.com/ CDK Construct Catalog https://awscdk.io/ AWS Construct Library Design Guidelines https://github.com/aws/aws-cdk/blob/master/DESIGN_GUIDELINES.md cdk.dev https://cdk.dev/
  48. おしまい