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

初学者向け CDK勉強会 外部公開用

yuto mori
November 18, 2024

 初学者向け CDK勉強会 外部公開用

社内勉強会で作成した資料を一部修正したもの

yuto mori

November 18, 2024
Tweet

More Decks by yuto mori

Other Decks in Technology

Transcript

  1. ©Fusic Co., Ltd. 1 森 優斗 Mori Yuto ❖ I

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

    code 「インフラアーキテクチャをコードで管理しよう」ってやつ ※今日はIaC化についての深掘りはしません
  3. ©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とは何か
  4. ©Fusic Co., Ltd. 6 AWS Cloud Development Kit (AWS CDK)

    CDKとは何か 使い慣れたプログラミング言語で クラウドリソースを定義できる OSSのフレームワーク AWS Cloud Development Kit (AWS CDK)
  5. ©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です
  6. ©Fusic Co., Ltd. 8 CDKのしくみ CDKとは何か プログラミング言語で インフラ構成を定義 AWS Cloud

    Development Kit (AWS CDK) AWS CloudFormation CDKによって CloudFormationテンプレート に変換 API呼び出し cdk deploy 実際のリソースが デプロイされる AWS Cloud ローカル
  7. ©Fusic Co., Ltd. 17 CloudFormationについてざっくり CDKを使う上で必要な概念 テンプレート JSON または YAML

    言語でフォーマットされた テキストファイル AWS Cloud Virtual private cloud (VPC) Public subnet スタック テンプレートを基に作成された リソースの集合体 Private subnet
  8. ©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
  9. ©Fusic Co., Ltd. 21 CDKのコンストラクトの概念 CDKを使う上で必要な概念 Construct Construct Amazon Aurora

    Amazon ECS ALB 誤解を恐れずにいうと Construct = クラス AWS Fargate class Fargate extends Construct class AuroraCluster extends Construct
  10. ©Fusic Co., Ltd. 23 CDKのコンストラクトの概念 CDKを使う上で必要な概念 Construct Construct Construct CDKの基本的な構築単位(ブロック)

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

    Amazon ECS ALB 開発者は抽象度を変えながら Constructを定義することができる AWS Fargate L1 L2 L3 というようなレイヤーで抽象度を選びながら実装できる
  12. ©Fusic Co., Ltd. 25 CDKのコンストラクトの概念 L1 L2 L3 詳細に記述 自由度が高い

    いい感じにしてくれる AWS Cloud ECSのよくあるパターン ECSはだいたいこんな感じ ALBはだいたいこんな感じ ECSについて、クラスターは こうして、サービスはこうし て、タスクについてこうし て、、、、、、、、 = CDKを使う上で必要な概念
  13. ©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のルール などが必要なときなどがあります
  14. ©Fusic Co., Ltd. 31 CDKのメリット CDKのメリット 1. OSSである(省略) 2. アプリケーションを作成する感覚でインフラ構築ができる

    3. 動的にリソースを定義できる 4. テストが充実している。CI/CDとの相性が良い 5. 抽象度化による開発スピードが向上
  15. ©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
  16. ©Fusic Co., Ltd. 42 CDKのデメリット CDKのデメリット 1. 他のIaCツールに比べて属人性が強い 2. 結局CloudFormationが足を引っ張っている

    3. cdk diff コマンドが本番リソースとのdiffじゃない 4. Importの挙動が気持ち悪い(主観)
  17. ©Fusic Co., Ltd. 43 他のIaCツールに比べて属人性が強い CDKのデメリット AWS CloudFormation AWS Cloud

    Development Kit (AWS CDK) 仕様書 を読む感覚 アプリのコード を読む感覚
  18. ©Fusic Co., Ltd. 44 結局CloudFormationが足を引っ張っている CDKのデメリット プログラミング言語で インフラ構成を定義 AWS Cloud

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

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

    (AWS CDK) AWS CloudFormation cdk deploy スタックの内容によってはCloudFormationが対応できずに ロールバックが失敗する うわ〜〜〜!!!!!!!
  21. ©Fusic Co., Ltd. 49 cdk diff コマンドが本番リソースとのdiffじゃない CDKのデメリット プログラミング言語で インフラ構成を定義

    AWS Cloud Development Kit (AWS CDK) AWS CloudFormation CDKによって CloudFormationテンプレート に変換 API呼び出し cdk deploy 実際のリソースが デプロイされる AWS Cloud ローカル
  22. ©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 ドリフト検出
  23. ©Fusic Co., Ltd. 51 Importの挙動が気持ち悪い(主観) CDKのデメリット AWS Cloud Development Kit

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

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

    (AWS CDK) AWS CloudFormation cdk import デプロイされているが CDK管理下にないリソース AWS Cloud ローカル 取り込みたいリソース について記述 物理名などのプロパティ を記載する リソースをCDK管理するため に不足している情報があったら コマンド実行時に追加入力する ドリフト検出 CloudFormationまでは保証されるが 実際のリソースが管理下である保証はなく ドリフト検出する必要がある
  26. ©Fusic Co., Ltd. 57 Thank You We are Hiring! https://recruit.fusic.co.jp/

    ご清聴いただきありがとうございました