0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS CDK と CI/CD を ゼロから理解する資料

0
Posted at

第0章 この資料のゴール

あなたが最終的に「なるほど!」と言えるようにしたいのは、次の1文です。

「TypeScript で書いたコードを cdk deploy すると、AWS 上にサーバーやデータベースが自動で建ち、
その後はコードを Git に push するだけで、アプリが自動で更新される」

この1文を、分解しながら理解していきます。あせらず、上から順に読んでください。
途中の専門用語はすべて、あとで「たとえ話」とセットで説明します。


第1章 そもそもの大前提(ここを飛ばさない)

1-1. サーバーって何?

あなたが使っている Web アプリ(ブラウザで開く画面)は、実は どこかのコンピュータの上で動いています
このコンピュータのことを サーバー と呼びます。

  • あなたの手元の PC = クライアント(使う側)
  • どこかで24時間動いている PC = サーバー(提供する側)

昔は、会社が自分で物理的なコンピュータ(鉄の箱)を買ってきて、電源を入れて、ケーブルをつないで…
としていました。これは大変です。壊れたら買い直し、性能が足りなくなったら増設…。

1-2. クラウド(AWS)って何?

そこで登場したのが クラウド です。代表例が AWS(Amazon Web Services) です。

クラウドをひとことで言うと:

「コンピュータやデータベースを、買うのではなく "借りる" 仕組み」

しかも、ネット越しに「コンピュータ1台ちょうだい」「データベース1個ちょうだい」と
注文すれば数分で用意してくれる レンタルサービスです。

このシステムは、この AWS の上に建っています。

1-3. AWS で「借りられる部品」の例

AWS にはたくさんの「部品(サービス)」があります。このシステムで使っている主なものだけ紹介します。
(今は「へぇ、こういう部品があるんだ」程度でOK。あとで何度も出てきます)

AWS の部品 これは何? 家にたとえると
VPC あなた専用の仮想ネットワーク(土地・区画) 家を建てる「土地」
EC2 / Fargate / ECS プログラムを動かすコンピュータ 家の「部屋」
RDS データベース(データの保管庫) 「金庫」
ElastiCache (Valkey/Redis) 一時的な高速メモリ保管 「冷蔵庫(すぐ取り出す用)」
S3 ファイル置き場(写真・書類など) 「物置・倉庫」
ALB アクセスを振り分ける受付係 「玄関の受付」
CloudFront / CDN 世界中に配信を速くする仕組み 「全国の配送拠点」
Cognito ログイン・ユーザー管理 「鍵と入館証の管理人」
Bedrock AI(Claude など)を呼び出すサービス 「相談できる専門家」
Lambda 短い処理をサッと実行する小型実行環境 「呼べば来る便利屋さん」
SQS 仕事を順番待ちさせる行列 「順番待ちの整理券」

このシステムは、これらの部品を 何十個も組み合わせて できています。


第2章 ここが核心:「手作業」と「コードで自動化」の違い

2-1. 手作業だと何が問題か

第1章の部品を、AWS の管理画面(マウスでポチポチする画面)から手で作ることもできます。
でも、それには大問題があります。

  • 間違える:ポチポチ作業は、設定を1つ押し間違えるだけで動かなくなる
  • 再現できない:「開発環境とまったく同じものを本番にも作って」と言われても、手順を覚えていない
  • 記録が残らない:誰がいつ何を変えたのか分からない
  • 時間がかかる:何十個の部品を毎回手で作るのは地獄

2-2. そこで「コードで書く」= IaC

この問題を解決するのが IaC(Infrastructure as Code / インフラをコードで書く) という考え方です。

「どんな部品を、どう組み合わせて作るか」を、文章(コード)として書いておく。
あとはそのコードを実行すれば、AWS が自動でその通りに作ってくれる。

料理にたとえると:

  • 手作業 = 毎回「勘」で料理する(味が安定しない、人に伝えられない)
  • IaC = レシピを書いておく(誰がやっても同じ料理ができる、改良の履歴も残る)

このシステムは、すべて「レシピ(コード)」で書かれています。 だから手で作った部品はほぼありません。


第3章 CloudFormation と CDK

3-1. CloudFormation = AWS 公式のレシピ形式

AWS には「IaC のための公式のレシピ形式」があります。それが CloudFormation です。

CloudFormation は、「どんな部品を作るか」を書いた巨大な設計図ファイル(テンプレート)を読み込んで、
その通りに AWS の部品を一気に作ってくれます。

ただし問題があります。CloudFormation のテンプレートは、書くのがとても面倒くさいのです。
JSON や YAML という形式で、何千行も手で書く必要があり、人間には読み書きが大変です。

3-2. CDK = レシピを「プログラミング言語」で書ける道具

そこで登場するのが、ついにこの資料の主役、CDK(Cloud Development Kit) です。

CDK とは「TypeScript などの普通のプログラミング言語で AWS のレシピを書ける道具」です。

CDK を使うと:

  1. あなたは TypeScript で「VPC を作る」「データベースを作る」と短く書く
  2. CDK がそれを、AWS が理解できる CloudFormation のテンプレート(巨大な設計図)に自動翻訳 する
  3. そのテンプレートを AWS に渡すと、部品が実際に建つ

つまり CDK は 「人間が書きやすい言葉 → AWS が分かる言葉」への翻訳機 です。

   あなたが書く                CDK が翻訳            AWS が実行
   TypeScript のコード   ──▶   CloudFormation   ──▶   実際のサーバー・DB が建つ
   (短くて読みやすい)        (巨大な設計図)        (クラウド上の本物)

3-3. 「synth」と「deploy」という2つの動作

CDK を触ると、必ずこの2つの言葉が出てきます。ここだけ覚えてください。

コマンド 何をする? たとえ
cdk synth TypeScript を CloudFormation の設計図に翻訳するだけ(まだ作らない) レシピを「清書」する
cdk deploy 翻訳した設計図を AWS に渡して実際に建てる レシピ通りに「料理する」
cdk diff 「今ある状態」と「コードの状態」の違いを見る 「前と何が変わった?」を確認

第4章 「スタック」という単位 ― CDK の部屋割り

CDK では、部品をいくつかの スタック(Stack) というグループに分けて管理します。

スタック = 関連する部品をまとめた「ひとかたまり」
CloudFormation はこのスタック単位で「作る・更新する・消す」を行います。

家を建てる作業にたとえると、こんなふうにグループ分けします。

  • 「土地・ネットワーク」のスタック
  • 「データベース」のスタック
  • 「アプリ本体」のスタック
  • 「配信(CDN)」のスタック

分けておくと、「データベースだけ作り直す」「アプリだけ更新する」が安全にできます。

4-1. bin/lib/ の関係(実際のフォルダ構成)

CDK プロジェクトのフォルダには、必ず binlib があります。

  • lib/ フォルダ = スタック1個ずつの「設計図の中身」が入っている(部品の作り方)
  • bin/ フォルダ = それらのスタックを「どの順で、どの環境に建てるか」を指揮する司令塔

料理でいうと、lib/ が「各料理のレシピ集」、bin/ が「今日のコース料理の組み立て表」です。


第5章 このシステムの全体像 ― CDK プロジェクトは「2つ」ある

ここが、あなたが混乱しやすい最重要ポイントです。
このシステムには、役割の違う CDK プロジェクトが2つあります。

projects/
├── infra-cdk/      ← ① インフラ本体を建てる(家そのもの)
└── pipeline-cdk/   ← ② CI/CD を建てる(自動更新の仕組み)
プロジェクト 役割 たとえ
infra-cdk アプリが動くための 箱(サーバー・DB・ネットワークなど)を建てる 家を建てる
pipeline-cdk コードが変わったら 自動でアプリを更新する仕組みを建てる 家に自動配達システムを取り付ける

※ もう1つ app というフォルダがありますが、これは アプリの中身(実際のプログラム本体) です。
CDK(インフラのレシピ)ではなく、「家の中で動くアプリそのもの」だと思ってください。

それぞれを順に見ていきます。


第6章 ① infra-cdk ― 「家を建てる」CDK

これは「アプリが動くための土台」を全部建てるプロジェクトです。
司令塔ファイル bin/infra-cdk.ts を見ると、建てる順番 がそのまま書いてあります。

実際に建てられるスタックは、おおよそ次の順番です(bin/infra-cdk.ts より)。

順番 スタック名 何を作る? たとえ
1 NetworkStack VPC(専用ネットワーク) 土地・区画整理
2 SecurityGroupStack 通信のルール(誰が入れるか) 塀とゲート
3 BedrockStack AI(Claude)を呼ぶ設定 相談できる専門家を契約
4 DatabaseStack RDS(DB)と Valkey(高速メモリ) 金庫と冷蔵庫
5 S3Stack ファイル置き場 物置
6 RoleStack 権限(誰が何をしてよいか) 役割と権限証
7 AuthorizationStack Cognito(ログイン管理)※注 入館証の管理人
8 IdentityPoolStack ログインユーザーの権限割当 ※注 入館証に応じた鍵配り
9 BatchStack 非同期のバッチ処理基盤 専用の作業部屋
10 ApplicationStack アプリ本体(フロントエンド・バックエンド・AI処理) 家のメインの部屋
11 CdnStack CloudFront(高速配信)※別リージョン 全国配送拠点

※注:7番・8番(Cognito 関連)は、staging / production だけで自動作成されます。
develop 環境では「すでに手で作った Cognito」を使い回すため、コードでは作りません。
bin/infra-cdk.tsif (existingUserPoolId && existingAppClientId) がこの分岐です)

6-1. スタックが「つながっている」とはどういうことか

ここで大事なのが、スタック同士はバラバラではなく、つながっているということです。

たとえば bin/infra-cdk.ts を見ると、こう書かれています(簡略化):

const network = new NetworkStack(...);                 // まずネットワークを作る
const database = new DatabaseStack({ vpc: network.vpc, ... });  // そのネットワークの中にDBを作る
const application = new ApplicationStack({ vpc: network.vpc, dbSecret: database... });  // DBに繋ぐアプリを作る

network.vpc のように、前に作った部品を次の部品に渡しているのが分かります。
これにより CDK は「ネットワーク → DB → アプリ」という 正しい順番 を自動で判断してくれます。
(DB を作る前にアプリは作れない、というような依存関係を自動管理)


第7章 「環境」という考え方 ― 同じ家を3軒建てる

7-1. なぜ環境を分けるのか

ソフトウェア開発では、いきなり本番(利用者が使う場所)で試すのは危険です。
そこで、同じ構成の "場所" を複数用意します。これを 環境(environment) と呼びます。

このシステムには3つの環境があります。

環境名 用途 たとえ
develop(dev) 開発者が日々試す場所 練習用のグラウンド
staging(stg) 本番直前の最終確認の場所 リハーサル会場
production(prod) 本物の利用者が使う場所 本番の試合会場

3つとも、ほぼ同じ部品構成です。 違うのは「どのAWSアカウントに建てるか」「設定値(URLや名前)」だけ。

7-2. 設定ファイル(YAML)で切り替える

「3環境ぶんのコードを3回書く」のは無駄です。そこで、部品の作り方(コード)は1つだけ書いて、
環境ごとに違う値は YAML ファイルに分けて
あります。

infra-cdk/config/
├── develop.yml      ← dev 用の設定値
├── staging.yml      ← stg 用の設定値
└── production.yml   ← prod 用の設定値

たとえば config/develop.yml には、こう書かれています(抜粋・アカウント番号はダミー):

environment: develop
accounts:
  deployments: "111122223333"   # CI/CD を動かすアカウント
  workloads:   "222233334444"   # アプリ本体が動くアカウント
rds:
  engineVersion: "17.6"         # データベースのバージョン

コマンド実行時に -c env=develop のように「どの環境か」を指定すると、
CDK は対応する YAML を読み込んで、その値で部品を建てます。

npx cdk deploy --all -c env=develop      # dev に建てる
npx cdk deploy --all -c env=staging      # stg に建てる
npx cdk deploy --all -c env=production   # prod に建てる

同じレシピ(コード)+ 違う調味料(YAML)= 3つの環境、というイメージです。

7-3. アカウントが2種類あるのはなぜ?(重要)

YAML をよく見ると、アカウント番号が 2種類 あります。

  • Deployments アカウント = CI/CD(自動更新の仕組み)を動かす場所
  • Workloads アカウント = アプリ本体が実際に動く場所(環境ごとに別アカウント)

なぜ分けるのか? 安全のためです。
「ビルドや配達を担当する作業場(Deployments)」と「利用者が触る本番の家(Workloads)」を
別の建物にしておけば、片方で事故っても、もう片方を守れます。

この2つをつなぐのが WorkloadDeployRole(次の章に出てきます)という「通行許可証」です。
CI/CD 側が、この許可証を使って Workloads 側に入って更新作業をします。


第8章 ② pipeline-cdk ― 「CI/CD(自動更新)」を建てる CDK

ここからが、もう一つの主役 CI/CD です。

8-1. CI/CD とは何か

  • CI(継続的インテグレーション) = コードが変わるたびに自動でチェック・テストする仕組み
  • CD(継続的デリバリー/デプロイ) = チェックを通ったコードを自動で環境に届ける仕組み

ひとことで言うと:

「コードを保存(push)するだけで、検査 → 組み立て → 設置 まで全部自動でやってくれるベルトコンベア」

これがないと、人間が毎回手で「ビルドして、アップロードして、サーバーを再起動して…」を
やらなければなりません。CI/CD はそれを全自動にします。

8-2. CI/CD を構成する AWS の部品

部品 役割 たとえ
CodeCommit ソースコードの保管庫(Git) 設計図の保管室
CodeBuild コードを組み立て・テストする作業員 工場の組み立てライン
CodePipeline 全工程をつなぐベルトコンベア 工場全体の指揮者
ECR 作ったアプリ(Dockerイメージ)の倉庫 完成品の倉庫
ECS / Fargate アプリを実際に動かす場所 完成品を設置する店舗

8-3. このシステムのパイプライン構成(実物)

pipeline-cdk/bin/pipeline-cdk.ts を見ると、次のスタックが建てられます。

スタック 役割
PipelineNetworkStack パイプライン作業用のネットワーク
RepositoryStack CodeCommit(コード倉庫)と ECR(イメージ倉庫)を作る
PipelineDevStack 本体のパイプライン(後述のベルトコンベア)
PipelineInitStack 初期セットアップ用のパイプライン
PipelinePrCiStack PR(修正提案)のときに自動検査するゲート(dev/stg のみ)

8-4. ベルトコンベアの中身(PipelineDevStack のステージ)

メインのパイプライン PipelineDevStack は、4つのステージ(工程) を順番に流れます。
lib/pipeline-dev-stack.tsnew codepipeline.Pipeline(...) 部分)

[1] Source          [2] ContainerBuild       [3] FunctionsUpdate      [4] DbMigration
 コードを取得    ──▶   アプリを組み立てて   ──▶   Lambda や            ──▶  データベースの
 (CodeCommit)         倉庫(ECR)へ入れ、         StepFunctions、           構造を最新化
                      店(ECS)を入れ替え          S3ファイルを更新          (alembic)

各ステージで何をしているか、もう少しだけ具体的に:

  • [1] Source:CodeCommit の develop ブランチから最新コードを取り出す。
    IsAutoDeploy: true なら、push されたら自動でコンベアが動き出す(develop は自動)。
  • [2] ContainerBuild:フロントエンド・バックエンド・AI処理・バッチ処理を Docker でビルドし、
    ECR(倉庫)に push。そのあと ECS のサービスを「新しいイメージで入れ替えろ」と命令する
    aws ecs update-service --force-new-deployment)。
  • [3] FunctionsUpdate:Lambda 関数、Step Functions、S3 上のプロンプトファイルなどを更新。
  • [4] DbMigration:データベースの表の構造を最新のコードに合わせる(alembic upgrade head)。

8-5. 「buildspec」= 作業員への作業指示書

CodeBuild(作業員)が「具体的に何のコマンドを打つか」は buildspec という指示書に書かれています。
このシステムでは2つの書き方が混在しています。

  • app/buildspec*.yml … ファイルとして置かれている指示書(おもに CI 検査用)。
    例:buildspec_ci_be_test.yml(バックエンドのテスト)、buildspec_ci_fe_lint.yml(フロントの文法チェック)
  • CDK のコード内に直接書かれた指示pipeline-dev-stack.ts の中の buildSpec: codebuild.BuildSpec.fromObject({...})
    デプロイ用のコマンド(docker build → push → ecs update)はこちら側に書かれています。

8-6. アカウントをまたぐ「通行許可証」(assume-role)

第7章で「Deployments と Workloads はアカウントが別」と言いました。
CI/CD は Deployments 側で動きますが、アプリ本体は Workloads 側にあります。

そこで pipeline-dev-stack.ts の中で、こういう処理をしています(簡略化・アカウント番号はダミー):

# Workloads アカウントの「WorkloadDeployRole」になりすます(一時的な通行許可証を取得)
aws sts assume-role --role-arn arn:aws:iam::222233334444:role/WorkloadDeployRole ...
# その許可証を使って、Workloads 側の ECS を更新する
aws ecs update-service --cluster app-cluster --service backend-service --force-new-deployment

これが「別アカウントの家に入って作業する」ための仕組み(assume-role)です。


第9章 総まとめ ― コード1行が本番に届くまでの全工程

ここまでの知識を全部つないで、1つのストーリーにします。
開発者が「ボタンの色を変えた」修正をしたら、何が起きるか?

① 開発者が修正コードを CodeCommit の develop ブランチに push
        │
        ▼
② (dev/stg では)PipelinePrCiStack のゲートが自動で検査
   = lint(文法チェック)とテストを実行。失敗したら止まる(buildspec_ci_*.yml)
        │  検査OK・developにマージ
        ▼
③ PipelineDevStack のベルトコンベアが自動起動(IsAutoDeploy: true)
        │
        ▼
   [Source]         CodeCommit から最新コードを取得
        │
   [ContainerBuild] Docker でアプリをビルド → ECR(倉庫)へ push
        │           → WorkloadDeployRole になりすまして
        │             ECS(店舗)を新イメージで入れ替え
        │
   [FunctionsUpdate] Lambda / StepFunctions / S3 を更新
        │
   [DbMigration]    データベースの構造を最新化(alembic)
        │
        ▼
④ Workloads アカウントの ECS 上で、新しいアプリが動き出す
        │
        ▼
⑤ ユーザーが CloudFront(CDN) 経由でアクセス → 新しいボタンの色が見える!

そして、この ①〜⑤を動かす仕組み(CodeCommit / CodeBuild / Pipeline / ECR / ECS)自体も、
すべて pipeline-cdk の CDK コードで建てられている
── これが「CI/CD も CDK で定義されている」の意味です。


第10章 よく使うコマンド早見表

すべて該当の CDK フォルダ(infra-cdkpipeline-cdk)の中で実行します。

# いま自分のコードと、AWS の現状との「違い」を確認する(安全。何も変えない)
npx cdk diff -c env=develop

# コードを CloudFormation テンプレートに翻訳するだけ(まだ作らない)
npx cdk synth -c env=develop

# 実際に AWS に建てる/更新する(本番反映。慎重に)
npx cdk deploy --all -c env=develop

# 特定のスタックだけ建てる(例:データベースだけ)
npx cdk deploy DatabaseStack -c env=develop

⚠️ 環境の指定 -c env=... を間違えると、違う環境に反映されます。 必ず確認してから実行してください。
(特に production への deploy は要注意)


第11章 用語集(迷ったらここに戻る)

用語 ひとことで言うと
AWS コンピュータやDBを「借りられる」クラウドサービス
IaC インフラ構成を「コード(レシピ)」で書く考え方
CloudFormation AWS 公式のレシピ形式(書くのは大変)
CDK CloudFormation を TypeScript で書ける翻訳機。この資料の主役①
synth コード → CloudFormation テンプレートに「翻訳」する
deploy テンプレートを使って AWS に「実際に建てる」
diff 今の状態とコードの「差分」を見る
スタック 関連する部品をまとめた管理単位(部屋割り)
環境(dev/stg/prod) 同じ構成の「場所」を用途別に複数用意したもの
CI/CD コードを push すると検査〜配置まで自動化する仕組み。この資料の主役②
CodeCommit コードの保管庫(Git)
CodeBuild コードを組み立て・テストする作業員
CodePipeline 工程をつなぐベルトコンベア
ECR 完成したアプリ(Dockerイメージ)の倉庫
ECS / Fargate アプリを実際に動かす場所
VPC 自分専用の仮想ネットワーク(土地)
RDS データベース
assume-role 別アカウントに入って作業するための「一時通行許可証」
buildspec CodeBuild への具体的な作業指示書
alembic データベースの表の構造を更新する道具

第12章 もっと詳しく知りたくなったら(実物の場所)

理解が進んだら、次のファイルを「答え合わせ」として開いてみてください。

知りたいこと 見るファイル
インフラ全体の建てる順番 infra-cdk/bin/infra-cdk.ts
各部品の作り方(DB、ネットワークなど) infra-cdk/lib/*.ts(例:database-stack.ts
環境ごとの設定値 infra-cdk/config/develop.yml ほか
CI/CD パイプラインの建て方 pipeline-cdk/bin/pipeline-cdk.ts
ベルトコンベアの中身(ステージ) pipeline-cdk/lib/pipeline-dev-stack.ts
CI 検査の具体的コマンド app/buildspec_ci_*.yml
CI/CD 環境ごとの設定値 pipeline-cdk/config/develop.yml ほか
使い方(コマンド) pipeline-cdk/README.md

最後にもう一度、第0章のゴールを

「TypeScript で書いたコードを cdk deploy すると、AWS 上にサーバーやデータベースが自動で建ち(= infra-cdk)、
その後はコードを Git に push するだけで、アプリが自動で更新される(= pipeline-cdk が建てた CI/CD)」

この1文の意味が、今は最初より「絵」として浮かぶはずです。それが理解できた証拠です。
わからない単語が出てきたら、第11章の用語集に戻ってください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?