Slide 1

Slide 1 text

©Fusic Co., Ltd. 0 CONFIDENTIAL CDK勉強会座学(外部公開用) 2024/08/05 名前 森優斗 @kotukotuganbad 2024/08/06 CDK 勉強会

Slide 2

Slide 2 text

©Fusic Co., Ltd. 1 森 優斗 Mori Yuto ❖ I am - 消防10年 Fusic 1年 - 初音ミクとギターが好きです ❖ Skills - Ruby on Rails / AWS ❖ Comment - エンジニア1年生 - 染めた髪の色が落ちてきました 自己紹介 はじめに 株式会社Fusic @福岡 技術創造部門 エンジニア @kotukotuganbad

Slide 3

Slide 3 text

©Fusic Co., Ltd. 2 CONTENTS 目次 1. CDKとは何か 2. CDKを使う上で必要な概念の話 3. CDKのメリット 4. CDKのデメリット

Slide 4

Slide 4 text

©Fusic Co., Ltd. 3 CDKとは何か 1

Slide 5

Slide 5 text

©Fusic Co., Ltd. 4 まず、IaCとは CDKとは何か IaC = Infrastructure as code 「インフラアーキテクチャをコードで管理しよう」ってやつ ※今日はIaC化についての深掘りはしません

Slide 6

Slide 6 text

©Fusic Co., Ltd. 5 AWS CloudFormation AWS Cloud Development Kit (AWS CDK) const repository = new ecr.Repository(this, 'MyRepository'); const fargateService = new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'MyFargateService', { taskImageOptions: { image: ecs.ContainerImage.fromEcrRepository(repository), }, }); ECSService: Type: 'AWS::ECS::Service’ Properties: Cluster: !Ref ECSCluster DesiredCount: 1 LaunchType: 'FARGATE’ TaskDefinition: !Ref TaskDefinition NetworkConfiguration: AwsvpcConfiguration: AssignPublicIp: 'ENABLED’ Subnets: - !Ref Subnet1 - !Ref Subnet2 SecurityGroups: - !Ref InstanceSecurityGroup esource "aws_ecs_service" "main" { name = "MyECSService" cluster = aws_ecs_cluster.main.id task_definition = aws_ecs_task_definition.main.arn desired_count = 1 launch_type = "FARGATE" CDKはIaC化を実現する手段の一つ CDKとは何か

Slide 7

Slide 7 text

©Fusic Co., Ltd. 6 AWS Cloud Development Kit (AWS CDK) CDKとは何か 使い慣れたプログラミング言語で クラウドリソースを定義できる OSSのフレームワーク AWS Cloud Development Kit (AWS CDK)

Slide 8

Slide 8 text

©Fusic Co., Ltd. 7 AWS Cloud Development Kit (AWS CDK) CDKとは何か https://github.com/aws/aws-cdk AWS Cloud Development Kit (AWS CDK) CDKはOSSです

Slide 9

Slide 9 text

©Fusic Co., Ltd. 8 CDKのしくみ CDKとは何か プログラミング言語で インフラ構成を定義 AWS Cloud Development Kit (AWS CDK) AWS CloudFormation CDKによって CloudFormationテンプレート に変換 API呼び出し cdk deploy 実際のリソースが デプロイされる AWS Cloud ローカル

Slide 10

Slide 10 text

©Fusic Co., Ltd. 9 CDKとは何かをざっくりいうと CDK何かとは CDKとは プログラミング言語で CloudFormationのテンプレートを生成できるツール

Slide 11

Slide 11 text

©Fusic Co., Ltd. 10 CDKを使う上で必要な概念の話 2

Slide 12

Slide 12 text

©Fusic Co., Ltd. 11 CDKを使う上で必要な概念の話 CDKを使う上で必要な概念 1. プログラミング言語について 2. オブジェクト指向について 3. CloudFormationの概念をざっくり 4. CDKのコンストラクトの概念

Slide 13

Slide 13 text

©Fusic Co., Ltd. 12 CDKを使う上で必要な概念の話 CDKを使う上で必要な概念 3. CloudFormationの概念をざっくり

Slide 14

Slide 14 text

©Fusic Co., Ltd. 13 CloudFormationについてざっくり CDKを使う上で必要な概念 CloudFormation テンプレートとは、 AWS上に構築するインフラストラクチャを説明する JSON または YAML 言語でフォーマットされた テキストファイルです。

Slide 15

Slide 15 text

©Fusic Co., Ltd. 14 CloudFormationについてざっくり CDKを使う上で必要な概念 CloudFormation テンプレート

Slide 16

Slide 16 text

©Fusic Co., Ltd. 15 CloudFormationについてざっくり CDKを使う上で必要な概念 CloudFormation スタックとは、 テンプレートによってプロビジョニングされる リソースの集合体

Slide 17

Slide 17 text

©Fusic Co., Ltd. 16 CloudFormationについてざっくり CDKを使う上で必要な概念 CloudFormation スタック テンプレート

Slide 18

Slide 18 text

©Fusic Co., Ltd. 17 CloudFormationについてざっくり CDKを使う上で必要な概念 テンプレート JSON または YAML 言語でフォーマットされた テキストファイル AWS Cloud Virtual private cloud (VPC) Public subnet スタック テンプレートを基に作成された リソースの集合体 Private subnet

Slide 19

Slide 19 text

©Fusic Co., Ltd. 18 CDKを使う上で必要な概念の話 CDKを使う上で必要な概念 4. コンストラクトの概念

Slide 20

Slide 20 text

©Fusic Co., Ltd. 19 CDKを使う上で必要な概念の話 CDKを使う上で必要な概念 さっきまではCloudFormationの話 ここからはCDKの話です AWS Cloud Development Kit (AWS CDK) AWS CloudFormation

Slide 21

Slide 21 text

©Fusic Co., Ltd. 20 CDKのコンストラクトの概念 CDKを使う上で必要な概念 App App アプリケーション全体 Stack Stack CloudFormationのスタック と同じ感覚でおk リソースの集合体 最小のデプロイ単位 Construct Construct Construct CDKの基本的な構築単位 (ブロック) 1つのコンストラクトに1つの リソース または複数のリソースを表現 クラスとして考えて良いです Amazon Aurora Amazon ECS ALB AWS Fargate

Slide 22

Slide 22 text

©Fusic Co., Ltd. 21 CDKのコンストラクトの概念 CDKを使う上で必要な概念 Construct Construct Amazon Aurora Amazon ECS ALB 誤解を恐れずにいうと Construct = クラス AWS Fargate class Fargate extends Construct class AuroraCluster extends Construct

Slide 23

Slide 23 text

©Fusic Co., Ltd. 22 CDKのコンストラクト概念 CDKを使う上で必要な概念 App Stack Construct Construct 今回のハンズオンの構成も このようになっています

Slide 24

Slide 24 text

©Fusic Co., Ltd. 23 CDKのコンストラクトの概念 CDKを使う上で必要な概念 Construct Construct Construct CDKの基本的な構築単位(ブロック) 1つのコンストラクトに1つのリソースまたは複数のリソースを表現 Amazon Aurora Amazon ECS ALB 開発者は抽象度を変えながら Constructを定義することができる AWS Fargate

Slide 25

Slide 25 text

©Fusic Co., Ltd. 24 CDKのコンストラクトの概念 CDKを使う上で必要な概念 Construct Construct Amazon Aurora Amazon ECS ALB 開発者は抽象度を変えながら Constructを定義することができる AWS Fargate L1 L2 L3 というようなレイヤーで抽象度を選びながら実装できる

Slide 26

Slide 26 text

©Fusic Co., Ltd. 25 CDKのコンストラクトの概念 L1 L2 L3 詳細に記述 自由度が高い いい感じにしてくれる AWS Cloud ECSのよくあるパターン ECSはだいたいこんな感じ ALBはだいたいこんな感じ ECSについて、クラスターは こうして、サービスはこうし て、タスクについてこうし て、、、、、、、、 = CDKを使う上で必要な概念

Slide 27

Slide 27 text

©Fusic Co., Ltd. 26 CDKのコンストラクト概念 CDKを使う上で必要な概念 L1 ほぼCloudFormationレベルで詳細に実装できる import { Stack, Construct, StackProps } from '@aws-cdk/core'; import { CfnVPC, CfnSubnet, CfnInternetGateway, CfnRouteTable, CfnRoute, CfnSubnetRouteTableAssociation, CfnVPCGatewayAttachment } from "@aws-cdk/aws-ec2"; export class LabStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const vpc = new CfnVPC(this, "lab-vpc", { cidrBlock: "10.0.0.0/16", enableDnsHostnames: true, enableDnsSupport: true, tags: [ { key: "Name", value: "lab-vpc" } ] }); const publicSubnet = new CfnSubnet(this, "lab-subnet", { vpcId: vpc.ref, cidrBlock: "10.0.0.0/24", availabilityZone: this.availabilityZones[0], tags: [ { key: "Name", value: "lab-subnet" } ] }); const igw = new CfnInternetGateway(this, "lab-igw", { tags: [ { key: "Name", value: "lab-igw" } ] }); const igwAttach = new CfnVPCGatewayAttachment(this, "lab-igw-attach", { vpcId: vpc.ref, VPC/Public Subnet/IGW/RouteTableを作る例 https://dev.classmethod.jp/articles/aws-cdk-layer/ 今回のハンズオンのアーキテクチャでは使っていません 用途としては、特異なリソースを作成するときや、 上位レイヤーでのサポートがないWAFのルール などが必要なときなどがあります

Slide 28

Slide 28 text

©Fusic Co., Ltd. 27 CDKのコンストラクト概念 CDKを使う上で必要な概念 L2 詳細な部分を抽象化して表現している Construct 今回ののアーキテクチャのほとんどはL2コンストラクトで構成されています! CloudFormationで実装するときに必要なネットワーク設定や細かい依存などを抽象化してくれます! めっちゃ便利(主観)

Slide 29

Slide 29 text

©Fusic Co., Ltd. 28 CDKのコンストラクト概念 CDKを使う上で必要な概念 L3 たった数行でよくある「パターン」をそのまま実装できる 今回のハンズオンのアーキテクチャでは、aws-ecs-patternsを使用しています! たった数行で複数のリソースを立ち上げています。 Construct Amazon ECS ALB AWS Fargate

Slide 30

Slide 30 text

©Fusic Co., Ltd. 29 ここまでのまとめ CDKはプログラミング言語でCloudFormationテンプレートを生成できるツール Point 01 CloudFormationのスタックはリソース群、テンプレートはテキストファイル Point 02 CDKではConstructという単位をメインに構築していくレイヤーによって抽象度を 選択しながら開発していく Point 03

Slide 31

Slide 31 text

©Fusic Co., Ltd. 30 CDKのメリット 3

Slide 32

Slide 32 text

©Fusic Co., Ltd. 31 CDKのメリット CDKのメリット 1. OSSである(省略) 2. アプリケーションを作成する感覚でインフラ構築ができる 3. 動的にリソースを定義できる 4. テストが充実している。CI/CDとの相性が良い 5. 抽象度化による開発スピードが向上

Slide 33

Slide 33 text

©Fusic Co., Ltd. 32 CDKのメリット CDKのメリット この動画にある程度まとめられているので時間があるときに見てください

Slide 34

Slide 34 text

©Fusic Co., Ltd. 33 アプリケーションを作成する感覚でインフラ構築ができる CDKのメリット app app/stack1 app/stack2 app/stack1/construct1 app/stack1/construct2 app/stack2/construct1 app/stack2/construct2 クラスと継承の概念でインフラを構築することができる 1コンストラクト、1クラス 複数のクラス(コンストラクト)をimport

Slide 35

Slide 35 text

©Fusic Co., Ltd. 34 アプリケーションを作成する感覚でインフラ構築ができる CDKのメリット 覚えることが少なくてすみ、アプリ側に注力する時間を増やせる

Slide 36

Slide 36 text

©Fusic Co., Ltd. 35 動的にリソースを定義できる CDKのメリット 環境によってRemovalPolicyを 変えたりすることができる

Slide 37

Slide 37 text

©Fusic Co., Ltd. 36 テストが充実している。CI/CDとの相性が良い CDKのメリット メインで使うことになるスナップショットテスト 数行で、テンプレート全体に差分がないかをテストすることができる

Slide 38

Slide 38 text

©Fusic Co., Ltd. 37 テストが充実している。CI/CDとの相性が良い CDKのメリット https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-CDK-Advanced-1-Testing_1227_v1.pdf 参照

Slide 39

Slide 39 text

©Fusic Co., Ltd. 38 抽象化による開発スピードが向上 CDKのメリット ぶっちゃけ一長一短ではある!!!

Slide 40

Slide 40 text

©Fusic Co., Ltd. 39 抽象化による開発スピードが向上 CDKのメリット 決してブラックボックスではない! この時点では抽象化されている テンプレートで詳細は把握できる

Slide 41

Slide 41 text

©Fusic Co., Ltd. 40 抽象化による開発スピードが向上 CDKのメリット 抽象化はソフトウェアの正常な発展の形(こわくない)

Slide 42

Slide 42 text

©Fusic Co., Ltd. 41 CDKのデメリット 4

Slide 43

Slide 43 text

©Fusic Co., Ltd. 42 CDKのデメリット CDKのデメリット 1. 他のIaCツールに比べて属人性が強い 2. 結局CloudFormationが足を引っ張っている 3. cdk diff コマンドが本番リソースとのdiffじゃない 4. Importの挙動が気持ち悪い(主観)

Slide 44

Slide 44 text

©Fusic Co., Ltd. 43 他のIaCツールに比べて属人性が強い CDKのデメリット AWS CloudFormation AWS Cloud Development Kit (AWS CDK) 仕様書 を読む感覚 アプリのコード を読む感覚

Slide 45

Slide 45 text

©Fusic Co., Ltd. 44 結局CloudFormationが足を引っ張っている CDKのデメリット プログラミング言語で インフラ構成を定義 AWS Cloud Development Kit (AWS CDK) AWS CloudFormation CDKによって CloudFormationテンプレートに変換 API呼び出し cdk deploy CDKの進歩は日々進んでいるが、元の構造的に CloudFormationの挙動に左右されるものが大きい

Slide 46

Slide 46 text

©Fusic Co., Ltd. 45 結局CloudFormationが足を引っ張っている CDKのデメリット AWS Cloud Development Kit (AWS CDK) AWS CloudFormation cdk deploy CDKはデプロイに失敗した際にロールバックを試みる ミスってるぽいから ロールバックして あいよ〜

Slide 47

Slide 47 text

©Fusic Co., Ltd. 46 結局CloudFormationが足を引っ張っている CDKのデメリット AWS Cloud Development Kit (AWS CDK) AWS CloudFormation cdk deploy スタックの内容によってはCloudFormationが対応できずに ロールバックが失敗する うわ〜〜〜!!!!!!!

Slide 48

Slide 48 text

©Fusic Co., Ltd. 47 結局CloudFormationが足を引っ張っている CDKのデメリット CloudFormationのスタックの ロールバックが失敗して 「うわ〜〜」ってなりがち CDKの操作ができなくなる

Slide 49

Slide 49 text

©Fusic Co., Ltd. 48 結局CloudFormationが足を引っ張っている CDKのデメリット CloudFormationの機能追加により対応策は増えてきています

Slide 50

Slide 50 text

©Fusic Co., Ltd. 49 cdk diff コマンドが本番リソースとのdiffじゃない CDKのデメリット プログラミング言語で インフラ構成を定義 AWS Cloud Development Kit (AWS CDK) AWS CloudFormation CDKによって CloudFormationテンプレート に変換 API呼び出し cdk deploy 実際のリソースが デプロイされる AWS Cloud ローカル

Slide 51

Slide 51 text

©Fusic Co., Ltd. 50 cdk diff コマンドが本番リソースとのdiffじゃない CDKのデメリット プログラミング言語で インフラ構成を定義 AWS Cloud Development Kit (AWS CDK) AWS CloudFormation CDKによって CloudFormationテンプレート に変換 API呼び出し cdk deploy 実際のリソースが デプロイされる AWS Cloud ローカル cdk diff ドリフト検出

Slide 52

Slide 52 text

©Fusic Co., Ltd. 51 Importの挙動が気持ち悪い(主観) CDKのデメリット AWS Cloud Development Kit (AWS CDK) AWS CloudFormation デプロイされているが CDK管理下にないリソース AWS Cloud ローカル 取り込みたいリソース について記述 物理名などのプロパティ を記載する

Slide 53

Slide 53 text

©Fusic Co., Ltd. 52 Importの挙動が気持ち悪い(主観) CDKのデメリット AWS Cloud Development Kit (AWS CDK) AWS CloudFormation cdk import デプロイされているが CDK管理下にないリソース AWS Cloud ローカル 取り込みたいリソース について記述 物理名などのプロパティ を記載する リソースをCDK管理するため に不足している情報があったら コマンド実行時に追加入力する

Slide 54

Slide 54 text

©Fusic Co., Ltd. 53 Importの挙動が気持ち悪い(主観) CDKのデメリット AWS Cloud Development Kit (AWS CDK) AWS CloudFormation cdk import デプロイされているが CDK管理下にないリソース AWS Cloud ローカル 取り込みたいリソース について記述 物理名などのプロパティ を記載する リソースをCDK管理するため に不足している情報があったら コマンド実行時に追加入力する ドリフト検出 CloudFormationまでは保証されるが 実際のリソースが管理下である保証はなく ドリフト検出する必要がある

Slide 55

Slide 55 text

©Fusic Co., Ltd. 54 Importの挙動が気持ち悪い(主観) CDKのデメリット https://speakerdeck.com/konokenj/reference-patterns-in-aws-cdk?slide=28 詳細についてはこちらがわかりやすいです

Slide 56

Slide 56 text

©Fusic Co., Ltd. 55 まとめ デメリットもありますが それ以上のメリットがあると思っています

Slide 57

Slide 57 text

©Fusic Co., Ltd. 56 まとめ 公式ワークショップをやってみましょう https://catalog.workshops.aws/typescript-and-cdk-for-beginner/ja-JP/

Slide 58

Slide 58 text

©Fusic Co., Ltd. 57 Thank You We are Hiring! https://recruit.fusic.co.jp/ ご清聴いただきありがとうございました