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

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

Kato Ryo
January 25, 2021

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

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

Kato Ryo

January 25, 2021
Tweet

More Decks by Kato Ryo

Other Decks in Technology

Transcript

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

    View full-size slide

  2. 自己紹介
    ● ロール
    ○ オンプレインフラ → AWSインフラ
    → バックエンドエンジニア
    ● 業務形態
    ○ 受託開発/コンサルティング
    ● プログラミング言語
    ○ TypeScript(Node.js)/Python/Go
    ● AWS
    ○ API Gateway/Lambda/DynamoDB
    (Severless)
    ○ ALB/ECS/RDS (Container)
    ● フェイズ
    ○ 設計〜初期開発(PoC)
    加藤 諒
    バックエンドエンジニア
    クラスメソッド株式会社

    View full-size slide

  3. 主な視聴者の想定
    AWSを使ってインフラ構築・開発をしている
    プログラミングができる(習得する気がある)
    CloudFormationやTerraformを使ったことがある

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  8. AWS Cloud
    Development Kit(CDK)
    とは

    View full-size slide

  9. AWS CDK 概要
    Deploy
    Synthesis

    View full-size slide

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

    View full-size slide

  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


    View full-size slide

  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

    View full-size slide

  13. 開発環境のセットアップ
    CDK CLIの使い方

    View full-size slide

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

    View full-size slide

  15. CloudFormationテンプレートの生成
    cdk synth
    スタックとローカルの比較
    cdk diff
    スタックのデプロイ
    cdk deploy
    スタックの破棄
    cdk destroy
    CDK CLIの基本操作

    View full-size slide

  16. TypeScriptのテンプレートの生成
    cdk init app --language typescript
    TypeScriptのテンプレートの生成(サンプルアプリ付)
    cdk init sample-app --language typescript
    TypeScriptのライブラリテンプレートの生成
    cdk init lib --language typescript
    CDK CLIでテンプレート生成

    View full-size slide

  17. CDK CLIは ~/.aws/credentials と ~/.aws/config を参照する
    1. --profileを指定した場合
    パラメータregionの指定も必須
    2. 環境変数
    環境変数AWS_DEFAULT_REGIONのの指定も必須
    3. デフォルトプロファイル
    パラメータregionの指定も必須
    CDK CLIが使用する認証情報

    View full-size slide

  18. デモンストレーション 1
    S3 バケットの作成

    View full-size slide

  19. AWS CDK
    Constructs

    View full-size slide

  20. AWS CDK
    Constructs
    ● App
    ○ CDKの全体を表す
    ○ 構成ツリーのルート
    ● Stack
    ○ デプロイのスコープ
    ○ CFnのStackと同じ
    ● Resouce
    ○ 1つまたは複数のAWSリソース
    ○ 再利用・共有が可能

    View full-size slide

  21. Constructの
    パラメータ
    ● scope: Construct
    ○ 親Construct
    ○ thisで渡すのが一般的
    ● id: string
    ○ scope内で一意なID
    ○ 物理名の一部に使われる
    ● props: XXX
    ○ 各Construct毎に固有

    View full-size slide

  22. 独自のConstructを
    作る
    1. Constructクラスを継承してクラス
    を作る
    2. propsを定義する
    3. Resourcesを定義する
    4. Resourcesを結合/設定変更する
    5. Resourcesをプロパティにする

    View full-size slide

  23. AWS
    Construct Library
    ● 定義済みのResource Construct
    がCDKには含まれている
    ● パラメータの指定だけで機能する
    ● 独自Constructで再利用できる

    View full-size slide

  24. AWS Construct Libraryのレベル

    View full-size slide

  25. AWS CDK
    Other Concepts

    View full-size slide

  26. 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)

    View full-size slide

  27. インスタンスに使用するAMI IDやデプロイ先の既存VPCのIDをキャッシュする
    仕組み
    Context

    View full-size slide

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

    View full-size slide

  29. Amazon S3 Asset(Lambda) Docker Image Asset(ECS)
    Asset

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  32. Constructsのテスト

    View full-size slide

  33. @aws-cdk/assert

    View full-size slide

  34. ● Snapshot test
    ○ 生成されるテンプレートに変化が無いかテストする
    ● Fine-grained test
    ○ AWSリソースが想定されるパラメータかテストする
    ● Validation test
    ○ Constructがpropsに対して正常にバリデーションするか
    Test types

    View full-size slide

  35. Construct全体に対してSnapshot test 

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

    期待する例外が投げられるか 

    Validation test

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


    View full-size slide

  36. 私がAWS CDKを推す理由


    View full-size slide

  37. ● 型が有る

    ○ これ文字列?数値?真偽値?で悩まなく良い

    ● バージョンやランタイム表記に悩まなくて良い

    ○ Lambdaのランタイムは node.js12? node.js 12? node.js12.x?

    ● プロパティの階層がわかる

    ○ エディタの補完を見ればネストがあっても怖くない

    いちいちエディタとリファレンスを

    往復しなくて良い


    View full-size slide

  38. ● TypeScriptで全部書ける

    ○ インフラ(CDK), バックエンド(Lambda), フロントエンド(React)

    ● 単一リポジトリで管理できる

    ○ Yarn workspace機能(eslint, tsconfigなどは個別管理できる)

    ○ 単一のユースケースに対して複数PR作成しなくて良い

    ● 脳のコンテキストスイッチが減る

    ○ 同じ言語、同じテストライブラリが使える

    TypeScriptでインフラ〜フロントエンドまで

    全部書ける!!


    View full-size slide

  39. ● Lambdaのバンドル処理をCDKで管理できる

    ○ Makefileやデプロイスクリプトから解放される

    ● IAMポリシーを自動生成してくれる

    ○ 最小権限ポリシーで管理しても破綻しない

    ● 冗長な記述をしなくて良い

    ○ L2 Constructのサポートが強力

    ○ LambdaとAPIの関連付けなどの処理をConstruct化できる

    サーバーレス開発がしやすい⚡


    View full-size slide

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

    View full-size slide

  41. ● このツールで何が出来るか?
    ○ 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

    View full-size slide

  42. ● このツールで何が出来るか?
    ○ 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

    View full-size slide

  43. ● このツールで何が出来るか?
    ○ CDKでTerraformを生成できる
    ● 様々なクラウドやSaaSを管理できる
    ○ AWS, GCP, Azure, GitHub, Kubernetes, …
    ● Terraformのメリットを引き継げる
    ○ Provision workflow(plan→apply→destory)
    ○ Import
    CDKtf - CDKを使用してTerraformを生成 -
    https://github.com/hashicorp/terraform-cdk

    View full-size slide

  44. 【付録】
    参考リンク

    View full-size slide

  45. 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/

    View full-size slide

  46. おしまい

    View full-size slide