+ 作るログイン
1 / 20
AWS でサービスを作る ― 知識ゼロから、構成を自分で考えられるまで / 全32章

AWS 19:CI/CD ― 自動で届ける

発行
アニメモ公式
版
第2版
改訂
コマ
全20

手元のパソコンから手で本番に出す怖さを、CI/CD のパイプラインで解決します。ビルドとテストの自動化、成果物を1つ作って使い回す考え方、GitHub Actions と OIDC で長く生きる鍵を置かずに AWS へデプロイする方法、CodePipeline などの純正の道具、ローリング・ブルー/グリーン・カナリアの入れ替え方と、壊れたときの戻し方をフォトログを例に説明します。

新しい版を、手で本番に出すのは怖い

第18章で、フォトログの構成(VPC・ALB・Auto Scaling・RDS など)はコードになりました。では、その上で動くアプリそのものの新しい版は、どうやって本番に届けているでしょうか。

よくあるのは、開発者が自分のパソコンでアプリを組み立て、Session Manager(第7章)でサーバーに入ってファイルを置き、アプリを再起動する、というやり方です。図は、それを金曜の夜に行った結果です。

起きたことなぜ起きるか
4台のうち1台だけ古い版(v1)のまま手で1台ずつ作業し、1台忘れた
テストを通していない版が出た急いでいて、テストを飛ばした
手元の未保存の変更が混ざった「自分のパソコンの今の状態」がそのまま出る
誰がいつ何を出したかわからない記録が残る仕組みが無い
壊れたときに戻せない前の版がどれか、どう戻すかが決まっていない

さらに、Auto Scaling(第12章)が新しい台を立ち上げると、その台には手で置いたファイルが入っていません。手作業のデプロイ(アプリを環境に届けて動かすこと)は、自動で増減する構成とそもそも相性が悪いのです。

手順は毎回少しずつ違い、慣れた頃に事故が起きます。この章では、この「届ける作業」を毎回同じ道を通る自動の流れにします。

※2026年9月時点の情報です。画面・料金・細部は変わることがあります。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 1 / 20
  • 新しい版を、手で本番に出すのは怖い
  • ノートPC
  • サーバー
  • v2
  • NG
  • 2台目に出し忘れた
  • 開発者のパソコン
  • 手でコピー
  • サーバー
  • NG
  • テストを通していない版
  • v1
  • 金曜の夜 23時
  • NG
  • 手元の未保存の変更が混ざる
  • 手順は毎回少しずつ違い、
  • サーバー
  • v2
  • 慣れた頃に事故が起きる
  • NG
  • 誰がいつ何を出したか不明
  • サーバー
  • v2
  • NG
  • 戻し方が決まっていない
  • ひらめき
  • 第18章で構成はコードになった。でもアプリの新しい版は、まだ誰かが手元から手で本番に届けている。

CI/CD:コードを置いたら、決まった道を自動で流れて届く

CI/CD は、コードの変更を決まった順番の工程に自動で流し、検査して、環境へ届ける仕組みです。工場のベルトコンベアにたとえられます。人が製品を1つずつ手で運ぶのではなく、コンベアに載せれば決まった検査と工程を通って出荷されます。

略語正式名意味
CI継続的インテグレーション変更を共有のコードに混ぜる(統合する)たびに、自動でビルドとテストを行う
CD継続的デリバリーテストに通ったものを、いつでも本番に出せる状態まで自動で運ぶ。本番の直前は人が承認する
CD継続的デプロイ本番まで全自動で出す

この一連の流れをパイプラインと呼びます。図の6つの段が、フォトログのパイプラインです。

番号段何をするか
1コード開発者が Git(第18章)に変更を入れる(push)
2ビルドアプリを動かせる形に組み立てる
3テスト自動のテストで確かめる
4試験環境stg(第18章)に出して、本番に近い環境で確かめる
5承認人が確認してボタンを押す(全自動にするなら省く)
6本番prod に出す

大事なのは、道が1本で、毎回同じであることです。誰が出しても、急いでいても、同じ検査を通ります。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 2 / 20
  • CI/CD:コードを置いたら、決まった道を自動で流れて届く
  • コード
  • 修理
  • OK
  • サーバー
  • いいね
  • ロケット
  • コード
  • ビルド
  • テスト
  • 試験環境
  • 承認
  • 本番
  • Git に push
  • 成果物を作る
  • 自動で確かめる
  • stg に出す
  • 人が押す
  • prod に出す
  • v2
  • 工場のベルトコンベアと同じ。人が1つずつ運ぶのではなく、決まった順に検査と工程を通って出ていく
  • CI=継続的インテグレーション CD=継続的デリバリー(本番の前で人が承認)/デプロイ(本番まで全自動)
  • ひらめき
  • CI=変更を混ぜるたびに自動でビルドとテスト。CD=通ったものを自動で環境へ届ける。道は毎回同じ。

① push すると、ビルドとテストが自動で走る

開発者がコードを main ブランチ(Git で本番に出すコードを置く枝)に入れると、それを合図にパイプラインが起動します。図では、新しい版(v2)の小包がテストの段まで進んでいます。

段自動で行うこと
ビルド必要なライブラリを入れ、アプリを組み立てる
テスト自動テストを実行する。フォトログなら「写真を投稿できる」「一覧が出る」など

テストに落ちた版は、そこで止まり、先へ進めません。作った人には通知が届きます。これが CI の役割です。「テストを飛ばして出してしまった」という事故が、仕組みとして起きなくなります。

テストに通った版は、次に試験環境(stg)へ出されます。stg で動作を確かめたら、承認の段で人がボタンを押し、本番へ進みます。

承認を挟むか向いているチーム
挟む(継続的デリバリー)テストがまだ少ない。本番に出すタイミングを人が決めたい
挟まない(継続的デプロイ)テストが充実していて、小さな変更を1日に何度も出したい

最初は承認を挟み、テストと監視(第17章)が育ってきたら外す、という進め方がよくあります。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 3 / 20
  • ① push すると、ビルドとテストが自動で走る
  • コード
  • 修理
  • OK
  • サーバー
  • いいね
  • ロケット
  • コード
  • ビルド
  • テスト
  • 試験環境
  • 承認
  • 本番
  • Git に push
  • 成果物を作る
  • 自動で確かめる
  • stg に出す
  • 人が押す
  • prod に出す
  • v2
  • NG
  • テストに落ちたら止まる
  • 作った人に通知が届く
  • ひらめき
  • 誰かが main にコードを入れると、パイプラインが起動する。テストに落ちた版は、その先へ進めない。

成果物:一度だけ作り、名前を付けて使い回す

ビルドした結果を成果物(アーティファクト)と呼びます。CI/CD でとても大事な決まりが、成果物は一度だけ作り、どの環境にも同じものを出すことです。

図では、ビルドは1回だけ行い、できた成果物に photolog-3f9c2a1 という名前を付けています。この同じ成果物を、試験環境にも本番にも出します。

やり方何が起きるか
成果物を1つ作って使い回すstg で確かめたものと、本番のものがまったく同じ。確かめた意味がある
本番のためにもう一度ビルドするライブラリの版がその日だけ変わるなど、確かめていないものが本番に出るおそれがある

成果物の形は、アプリの動かし方で決まります。

成果物の例置き場所使う章
アプリを固めた zipS3(第15章)この章
アプリを入れて焼いた AMIEC2 の AMI(第10章)この章のフォトログ
コンテナイメージECR第21章

名前には、Git のコミット ID(変更1回ごとに付く識別子)や版番号を使います。こうすれば「今、本番で動いているのはどの版か」「どの変更が入っているか」に、いつでも答えられます。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 4 / 20
  • 成果物:一度だけ作り、名前を付けて使い回す
  • サーバー
  • 荷物
  • 試験環境(stg)
  • 修理
  • photolog-3f9c2a1
  • ビルド
  • コミットの ID を名前に
  • 1回だけ
  • サーバー
  • 本番(prod)
  • 成果物の例
  • アプリを固めた zip(S3)、焼いた AMI(第10章)、コンテナイメージ(第21章)
  • 名前の付け方
  • Git のコミット ID や版番号。「どの版が本番にいるか」を答えられる
  • ひらめき
  • ビルドの結果を「成果物」として S3 などに置き、版の名前を付ける。どの環境にも同じものを出す。

GitHub Actions:リポジトリの中にパイプラインを書く

パイプラインを動かす道具はいくつもありますが、コードを GitHub に置いているなら、GitHub Actions がいちばん手軽です。

GitHub Actions では、リポジトリ(コードの置き場所)の .github/workflows/ というフォルダに、YAML(第18章)でワークフロー(自動で行う手順)を書きます。図の左がその例です。

行意味
on: push: branches: [main]main ブランチに push されたら動く
runs-on: ubuntu-latestGitHub が用意した Linux のマシンで動かす
run: npm ci && npm test依存ライブラリを入れて、テストを実行する
run: npx cdk deploy …CDK(第18章)で AWS にデプロイする

ワークフローを実行するマシンをランナーと呼びます。GitHub が用意するランナーは、実行のたびにまっさらな状態で起動し、終われば消えます。手元のパソコンのような「その人の環境の癖」が混ざりません。

ワークフローのファイル自体もコードなので、Git に履歴が残り、変更はレビューできます。

ここで1つ問題があります。最後の行の cdk deploy は、AWS を操作します。つまり、ランナーには AWS を触る権限が要ります。それをどう渡すかが、次の話です。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 5 / 20
  • GitHub Actions:リポジトリの中にパイプラインを書く
  • # .github/workflows/deploy.yml
  • on:
  • push:
  • コード
  • GitHub(コードの置き場)
  • branches: [main] # main に入ったら
  • push・プルリクエストで起動
  • jobs:
  • deploy:
  • runs-on: ubuntu-latest # GitHub のマシンで
  • steps:
  • サーバー
  • ランナー(実行するマシン)
  • 毎回まっさらな状態で起動し、終われば消える
  • - run: npm ci && npm test
  • - run: npx cdk deploy … # ← AWS の権限が要る
  • ひらめき
  • リポジトリの YAML に書いた手順を、GitHub が用意したマシンで実行する。

問題:ランナーに、AWS を触る権限をどう渡すか

以前よく使われていたのは、IAM ユーザーのアクセスキー(第3章)を作って、GitHub の「シークレット」(暗号化して保存する設定値)に入れておく方法です。

しかし第3章で見たように、アクセスキーは長く生きる鍵です。

アクセスキーの問題何が起きるか
漏れる経路が多いワークフローのログへの出力、悪意のある変更、人の手による持ち出し
期限が無い誰かが消すまで、何年でも使える
誰が使ったか区別できない漏れた鍵での操作も、正規の操作と同じに見える
入れ替えが面倒定期的に作り直して、全部の置き場所を更新しないといけない

デプロイ用の鍵は、本番を変えられる強い権限を持っています。これが漏れると、そのまま本番を壊されます。

本当に欲しいのは、「そのリポジトリの、その1回の実行のあいだだけ使える、すぐ期限が切れる鍵」です。そして、どこにも鍵を保存しておかずに済む方法です。それを実現するのが OIDC を使った連携です。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 6 / 20
  • 問題:ランナーに、AWS を触る権限をどう渡すか
  • 鍵
  • 鍵が漏れると
  • サーバー
  • クラウド
  • ログ・フォーク・人の手から
  • ランナー
  • アクセスキー
  • AWS
  • cdk deploy したい
  • 砂時計
  • ずっと使える
  • 消すまで期限が無い
  • 欲しいのは「そのリポジトリの、その実行のあいだだけ使える、短い期限の鍵」
  • → それを実現するのが OIDC(鍵を置かない連携)
  • ひらめき
  • アクセスキーを GitHub に置くと、漏れたら誰でも使え、期限も無い(第3章)。

OIDC:GitHub が発行する「身分証」で、ロールをかぶる

OIDC(OpenID Connect)は、ある組織が発行した「身分証」を、別の組織が確かめて信用するための決まりです。ここでは、GitHub が発行した身分証を、AWS が確かめて信用するように設定します。

図の番号の順に流れを見ます。

番号何が起きるか
1ランナーが GitHub に身分証(トークン)を発行してもらう。そこには「どのリポジトリの、どのブランチの、どの実行か」が書かれ、GitHub の署名が付いている
2ランナーは身分証を AWS の STS(一時的な鍵を発行するサービス)に見せる。STS は GitHub の署名を確かめる
3身分証の中身が、IAM ロール(第3章)の条件に合えば、ロールを「かぶった」一時的な鍵が渡される

渡される鍵は、短い時間(既定では1時間ほど)で切れます。ワークフローはその鍵で cdk deploy などを実行し、終われば鍵は使えなくなります。

アクセスキーOIDC
保存しておく鍵GitHub に置くどこにも置かない
鍵の寿命無期限実行のあいだだけ
誰の操作か区別しにくいどのリポジトリの、どの実行かがわかる

準備として、AWS の IAM に「GitHub を身分証の発行元として信じる」という ID プロバイダーを1つ登録し、デプロイ用のロールを作っておきます。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 7 / 20
  • OIDC:GitHub が発行する「身分証」で、ロールをかぶる
  • コード
  • GitHub
  • ① 誰の・どのブランチの実行か
  • 身分証を発行
  • サーバー
  • ランナー
  • 身分証
  • 鍵
  • AWS STS
  • 人
  • IAM ロール
  • 身分証を確かめる
  • deploy-photolog
  • 一時的な鍵
  • 置いておく鍵
  • 無い(GitHub にも AWS にも、長く生きる鍵は置かない)
  • 渡される鍵
  • ロールをかぶった一時的な鍵。短い時間で切れる(第3章)
  • ひらめき
  • GitHub の身分証(トークン)を AWS が確かめ、短い時間で切れる鍵を渡す。

誰にかぶらせるかは、ロールの信頼ポリシーで絞る

「GitHub の身分証なら信じる」だけでは危険です。GitHub には世界中の人のリポジトリがあり、誰のリポジトリでも GitHub の身分証はもらえるからです。そこで、ロールの信頼ポリシー(誰がこのロールをかぶってよいかを決める JSON、第3章)で、条件を絞ります。

図の左が、デプロイ用ロールの信頼ポリシーの主要部分です。

項目意味
Principal の FederatedGitHub(token.actions.githubusercontent.com)の身分証を信じる
Action: sts:AssumeRoleWithWebIdentity身分証を使ってロールをかぶる操作
条件 audAWS 向けに発行された身分証であること
条件 subどのリポジトリの、どのブランチ(または環境)か。ここでは photolog/app の main だけ

いちばん大事なのが `sub` です。これが無いと、他人のリポジトリのワークフローからでも、あなたのロールをかぶれてしまいかねません。IAM も、GitHub を信じるロールで sub の条件が無いものや、* だけのものは作らせない仕組みになっています。

もう1つ、ロールの権限そのものも絞ります。デプロイに要るのは、CDK のデプロイに必要な操作だけです。管理者権限を付けると、ワークフローが乗っ取られたときに、アカウント全体を差し出すことになります(最小権限、第3章)。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 8 / 20
  • 誰にかぶらせるかは、ロールの信頼ポリシーで絞る
  • "Principal": { "Federated": "arn:aws:iam::…:oidc-provider/
  • Principal
  • GitHub の身分証を信じる
  • token.actions.githubusercontent.com" },
  • "Action": "sts:AssumeRoleWithWebIdentity",
  • aud
  • AWS 向けの身分証か
  • "Condition": { "StringEquals": {
  • "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
  • "token.actions.githubusercontent.com:sub":
  • sub
  • どのリポジトリ・ブランチか
  • "repo:photolog/app:ref:refs/heads/main" } }
  • sub の条件がいちばん大事。リポジトリとブランチ(または環境)まで絞る
  • ロールの権限そのものも、デプロイに要るものだけに絞る(最小権限・第3章)
  • ひらめき
  • 「このリポジトリの main の実行だけ」と条件を書く。無いと他人でもかぶれる。

ワークフローで OIDC を使う

準備ができたら、ワークフローから OIDC を使います。図の設定で大事なのは次の3か所です。

設定意味
permissions: id-token: writeこのワークフローが、GitHub に身分証を発行してもらうことを許す
aws-actions/configure-aws-credentialsAWS が公開しているアクション。身分証を STS に渡し、一時的な鍵を受け取って、後の手順で使えるようにする
role-to-assumeかぶるロールの ARN

ファイルのどこにも、鍵は書かれていません。ロールの ARN は秘密ではないので、書いてあっても問題ありません。

最後の行の --require-approval never は、CDK が「セキュリティに関わる変更を実行してよいか」と聞いてくる確認を省く指定です。パイプラインの中では人が答えられないためです。その代わり、変更はプルリクエスト(変更を取り込む前にレビューする仕組み)の段階で、cdk diff(第18章)の結果を見てレビューします。

図の @v4 のような、アクションの版の指定は、使うときに公式の最新の案内を確かめてください。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 9 / 20
  • ワークフローで OIDC を使う
  • permissions:
  • id-token: write # GitHub に身分証を発行してもらう
  • contents: read
  • steps:
  • - uses: actions/checkout@v4
  • - uses: aws-actions/configure-aws-credentials@v4
  • with:
  • role-to-assume: arn:aws:iam::123456789012:role/deploy-photolog
  • aws-region: ap-northeast-1
  • - run: npm ci && npm test
  • - run: npx cdk deploy --all --require-approval never
  • アクション名の @v4 などの版は、使うときに公式の最新を確かめる
  • ひらめき
  • id-token の権限を与え、configure-aws-credentials でロールをかぶる。鍵はどこにも書かない。

AWS 純正の道具:CodePipeline・CodeBuild・CodeDeploy

GitHub Actions を使わず、AWS の中でパイプラインを組むこともできます。AWS には、役割ごとに3つの道具があります。

サービス役割GitHub Actions でいうと
AWS CodePipeline段の順番と、成果物の受け渡しを決める。承認の段も置けるワークフロー全体の流れ
AWS CodeBuildビルドとテストを実行するマシンを、実行のたびに用意するランナー
AWS CodeDeployEC2 などへ新しい版を配り、入れ替え方と戻し方を管理するデプロイの手順

どちらを選ぶかの目安です。

選び方理由
GitHub Actionsコードが GitHub にあり、チームが慣れている。多くのチームの第一候補
Code シリーズAWS の中で完結させたい。実行するマシンに IAM ロールをそのまま付けられ、VPC の中で動かすこともできる
組み合わせるGitHub への push をきっかけに CodePipeline を動かす、といった組み合わせもできる

どちらを選んでも、成果物を1つ作る、鍵を置かない、入れ替え方と戻し方を決めておくという考え方は同じです。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 10 / 20
  • AWS 純正の道具:CodePipeline・CodeBuild・CodeDeploy
  • 更新
  • 修理
  • 送信
  • CodePipeline
  • CodeBuild
  • CodeDeploy
  • 段の順番と流れを決める
  • ビルドとテストを実行する
  • EC2 などへ配る・戻す
  • GitHub Actions を使う
  • コードが GitHub にあり、チームが慣れている。多くのチームの第一候補
  • Code シリーズを使う
  • AWS の中で完結させたい。IAM ロールをそのまま使える
  • 組み合わせる
  • GitHub をきっかけに CodePipeline を動かすこともできる
  • ひらめき
  • AWS の中で組むなら、流れ・ビルド・配る、の3つの道具を組み合わせる。

入れ替え方①:一斉に入れ替えると、その間は止まる

成果物が本番の手前まで来ました。最後に、今動いている4台を、どうやって新しい版にするかを決めます。ここからは、図の ALB(第11章)とその後ろの4台を舞台に、入れ替え方を比べます。

いちばん単純なのは、全台を一斉に止めて、新しい版にするやり方です。

利点欠点
速い。手順が単純入れ替えのあいだ、動いている台が0台になり、利用者はエラーを見る
新旧の版が混ざらない新しい版が壊れていたら、利用者全員に一度に届く

図では、4台すべてが「停止中」になっています。ALB は送り先が無いので、利用者にエラー(503)を返すしかありません。

試験環境や、夜中に止めてよい社内向けのサービスなら、これで十分なこともあります。でも、フォトログの本番のようにいつでも誰かが使っているサービスには向きません。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 11 / 20
  • 入れ替え方①:一斉に入れ替えると、その間は止まる
  • NG
  • 停止中
  • NG
  • 入れ替えのあいだ、利用者はエラーを見る
  • NG
  • 停止中
  • NG
  • 壊れた版が一度に全員へ
  • ネットワーク
  • ALB
  • NG
  • 停止中
  • OK
  • 速い・単純(試験環境なら十分)
  • NG
  • 停止中
  • ひらめき
  • 全台を同時に止めて新しい版にすると、速いがサービスが止まる。新しい版が壊れていたら全員に届く。

入れ替え方②:ローリング ― 数台ずつ順に入れ替える

ローリングは、何台かずつ順番に入れ替えるやり方です。図では、上の2台はもう新しい版(v2・緑)になり、3台目を入れ替え中、4台目はまだ古い版(v1・黄)です。

1台ずつの入れ替えは、次の順で進みます。

順何をするか
1ALB の送り先からその台を外す(処理中のリクエストが終わるのを待つ)
2新しい版にする(新しい台と入れ替える)
3ALB のヘルスチェック(第11章)に通ったら、送り先に戻す
4次の台へ
利点・注意内容
止まらない常に何台かがリクエストを受けている
新旧が混ざる途中は v1 と v2 が同時に動く。両方が同時に動いても困らないように作る必要がある
戻すのは遅い戻すのも1台ずつ

フォトログのように Auto Scaling を使っているなら、インスタンスの更新(Instance Refresh)という機能が使えます。起動テンプレート(第12章)の AMI を新しい版に替えてから実行すると、「最低何%の台を健全に保つか」を守りながら、古い台を新しい台へ順に入れ替えてくれます。途中で止めて確かめるチェックポイントや、失敗したときの自動の巻き戻しも設定できます。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 12 / 20
  • 入れ替え方②:ローリング ― 数台ずつ順に入れ替える
  • サーバー
  • v2
  • 止まらない
  • 常に何台かが受けている
  • 混ざる
  • 途中は v1 と v2 が同時に動く
  • サーバー
  • v2
  • ネットワーク
  • ALB
  • 戻すのは遅い
  • 戻すのも1台ずつ
  • 更新
  • 入替中
  • Auto Scaling の「インスタンスの更新」で、
  • 最低何%を健全に保つかを決めて入れ替えられる
  • サーバー
  • v1
  • ひらめき
  • 外して入れ替え、ヘルスチェックに通ったら戻す。止まらないが、途中は新旧が混ざる。

入れ替え方③:ブルー/グリーン ― もう1組作って切り替える

ブルー/グリーンは、今の版の組(ブルー)はそのままにして、新しい版の組(グリーン)を丸ごと別に作るやり方です。

順何をするか
1グリーンの組を作り、新しい版で起動する(この時点では利用者は来ない)
2グリーンを確かめる(ヘルスチェック、試験用の入口からの動作確認など)
3ALB の向きを、ブルーからグリーンへ切り替える
4しばらく様子を見て、問題なければブルーを消す

図では、ALB の青い矢印がグリーンの組へ向いています。ALB では、リスナー(第11章)の送り先のターゲットグループを替えることで切り替えます。

利点・注意内容
一瞬で戻せる壊れていたら、ALB の向きをブルーに戻すだけ。ブルーはまだ動いている
混ざらない切り替えの瞬間に、全員が新しい版へ移る
一時的に2倍切り替えのあいだ、2組ぶんの EC2 が動き、料金も2倍になる

戻すのが速いことが、ブルー/グリーンの最大の価値です。CodeDeploy は、EC2 と Auto Scaling の組み合わせでもブルー/グリーンのデプロイを扱えます。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 13 / 20
  • 入れ替え方③:ブルー/グリーン ― もう1組作って切り替える
  • ブルー(今の版)
  • グリーン(新しい版)
  • 利点
  • サーバー
  • v1
  • サーバー
  • 一瞬で戻せる
  • v2
  • 利点
  • 混ざらない
  • サーバー
  • v1
  • サーバー
  • v2
  • 注意
  • 一時的に2倍
  • ネットワーク
  • ALB
  • サーバー
  • v1
  • サーバー
  • v2
  • サーバー
  • v1
  • サーバー
  • v2
  • 切り替え
  • ひらめき
  • 新しい版の組を丸ごと作り、確かめてから ALB の向きを切り替える。戻すのも一瞬。

少しずつ流す:カナリア

ブルー/グリーンは「一瞬で全員を切り替える」ので、新しい版が壊れていると、その瞬間は全員が影響を受けます。そこで、最初は一部の利用者だけを新しい版に流すやり方があります。これをカナリアと呼びます(昔、炭鉱で有毒なガスに先に気づくためにカナリアを連れて入ったことから)。

図では、ALB が9割を今の版へ、1割を新しい版へ送っています。

順何をするか
1新しい版に1割だけ流す
2第17章のアラームで、新しい版の 5xx の数や返事の遅さを見張る
3問題が無ければ、3割、5割、全部、と割合を上げる
4問題があれば、割合を0に戻す。影響は1割の利用者だけで済む

ALB には、1つのリスナーから複数のターゲットグループへ、重みを付けてリクエストを分ける機能があります。これを使えば、割合を少しずつ変えられます。

カナリアは、監視(第17章)がしっかりしていてはじめて意味があります。「1割に流したが、壊れているかどうか誰も見ていない」では、ただ遅いだけのデプロイになってしまいます。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 14 / 20
  • 少しずつ流す:カナリア
  • 今の版
  • 新しい版
  • サーバー
  • v1
  • サーバー
  • v2
  • 折れ線
  • 見張る
  • 5xx・遅さ(第17章)
  • サーバー
  • v1
  • サーバー
  • v2
  • ネットワーク
  • ALB
  • 9割
  • ALB はターゲットグループ
  • サーバー
  • v1
  • サーバー
  • v2
  • ごとに流す割合(重み)
  • を決められる
  • サーバー
  • v1
  • サーバー
  • v2
  • 1割
  • ひらめき
  • まず1割の利用者だけ新しい版へ。エラーが増えなければ割合を上げる。壊れていても被害は一部で済む。

戻し方:壊れたら、前の版をもう一度出す

どれだけ気をつけても、壊れた版が出ることはあります。大事なのは、戻し方を先に決めて、自動にしておくことです。図の番号の順に流れを見ます。

番号何が起きるか
1新しい版を出した直後に、5xx のアラーム(第17章)が鳴る
2入れ替えを止める。CodeDeploy やインスタンスの更新は、アラームをきっかけに自動で巻き戻す設定ができる
3前の版の成果物(photolog-8d1e7b0)をもう一度出す

成果物に名前を付けて残しておいたのは、このためです。「前の版」がはっきりしていれば、戻すのは前の成果物でもう一度デプロイするだけです。

入れ替え方によって、戻す速さが違います。

入れ替え方戻し方
ブルー/グリーンALB の向きを戻すだけ。いちばん速い
ローリング前の成果物で、もう一度ローリング
カナリア新しい版への割合を0に戻す

1つ、戻しにくいものがあります。DB の形の変更(列を消す、名前を変える、など)です。新しい版と一緒に DB の列を消すと、前の版に戻したとき、前の版が使う列がもう無い、ということが起きます。そこで DB の変更は、「列を足す → 新しい版を出す → 古い列を使わなくなってから消す」のように、新旧どちらの版でも動く形で、数回に分けて行います。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 15 / 20
  • 戻し方:壊れたら、前の版をもう一度出す
  • 通知
  • アラームが鳴る
  • NG
  • 入れ替えを止める
  • 更新
  • 前の版を出す
  • 5xx が増えた(第17章)
  • 自動のロールバック
  • photolog-8d1e7b0
  • ブルー/グリーン
  • ALB の向きを戻すだけ
  • ローリング
  • 前の成果物で、もう一度ローリング
  • DB の形の変更
  • 戻せないことがある。新旧どちらの版でも動くように、数回に分けて変える
  • ひらめき
  • 前の成果物をもう一度出せば戻る。戻しも自動に。DB の形の変更だけは戻りにくい。

フォトログのパイプライン

ここまでをまとめて、フォトログのパイプラインを決めます。

段中身
①② コード・ビルドmain への push で GitHub Actions が起動し、OIDC でデプロイ用ロールをかぶる。アプリを入れた AMI を焼く(第10章)
③ テスト自動テスト。落ちたらそこで止まる
④ 試験環境stg の起動テンプレートを新しい AMI に替え、インスタンスの更新でローリング
⑤ 承認stg で動作を確かめ、人が承認する(GitHub の「環境」の承認機能などを使う)
⑥ 本番同じ AMI で本番をローリング。5xx のアラームが鳴ったら、前の AMI へ自動で戻す

構成の変更(第18章の CDK のコード)も、同じパイプラインで流します。プルリクエストの段階で cdk diff の結果をレビューし、main に入ったら stg → 承認 → 本番の順に cdk deploy します。

こうして、アプリも構成も、main に入ったものだけが、同じ道を通って本番に届くようになりました。誰のパソコンからも、直接本番を変えることはありません。

AMI を焼く方式は、1回のビルドに時間がかかるのが弱点です。もっと速く、軽く届けたくなったら、第21章のコンテナが答えになります。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 16 / 20
  • フォトログのパイプライン
  • コード
  • 修理
  • OK
  • サーバー
  • いいね
  • ロケット
  • コード
  • ビルド
  • テスト
  • 試験環境
  • 承認
  • 本番
  • Git に push
  • 成果物を作る
  • 自動で確かめる
  • stg に出す
  • 人が押す
  • prod に出す
  • ①②③
  • GitHub Actions で npm test。通ったら新しい AMI を焼く(第10章)
  • ④
  • stg の起動テンプレートを新しい AMI に替え、インスタンスの更新
  • ⑤
  • stg で動作を確かめ、人が承認ボタンを押す
  • ⑥
  • 本番も同じ AMI で。アラームが鳴ったら自動で前の AMI に戻す
  • ひらめき
  • push → テスト → AMI を焼く → stg → 承認 → 本番。戻しは前の AMI で。

お金:実行した「分」に払う

CI/CD の道具は、多くが実行にかかった時間で課金されます。

道具何に課金されるか
GitHub ActionsGitHub の料金。公開リポジトリは GitHub が用意するランナーを無料で使え、非公開でも一定の無料枠がある
CodeBuildビルドにかかった分数。マシンの大きさで単価が違う。無料枠あり
CodePipelineV2 のパイプラインは、各段(アクション)の実行にかかった分数。無料枠あり
CodeDeployEC2 などへ配る分には追加料金なし(手元のサーバーへ配ると課金)
成果物の置き場S3 の保存料。古い AMI はスナップショットの保存料
ブルー/グリーン切り替えのあいだ、EC2 が2組ぶん動く

単価と無料枠は、それぞれの料金ページで確認してください。

いちばん忘れやすいのは、成果物がたまり続けることです。毎日何度もビルドすると、AMI や zip がどんどん増えます。「直近の10個だけ残す」のように決めて、S3 のライフサイクル(第15章)や、古い AMI を消す仕組みで片付けます。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 17 / 20
  • お金:実行した「分」に払う
  • GitHub Actions
  • GitHub の料金。公開リポジトリと、無料枠の範囲は無料
  • CodeBuild
  • ビルドにかかった分(マシンの大きさで単価が違う)。無料枠あり
  • CodePipeline
  • V2 は各段の実行にかかった分。無料枠あり
  • CodeDeploy
  • EC2 へ配る分には追加料金なし
  • 成果物の置き場
  • S3 の保存料。古い版はライフサイクルで消す(第15章)
  • ブルー/グリーン
  • 切り替えのあいだ、EC2 が2組ぶん動く
  • 単価と無料枠は、それぞれの料金ページで確認する
  • ひらめき
  • 多くは実行した時間で課金され、無料枠もある。ブルー/グリーンは一時的に2倍。

よくある落とし穴

パイプラインは、本番を変えられる強い権限を持っています。つまり、パイプラインを乗っ取られることは、本番を乗っ取られることと同じです。

落とし穴何が起きるか対策
アクセスキーを GitHub に保存漏れたら、そのまま本番を触られるOIDC にする
信頼ポリシーで sub を絞らない他のリポジトリやブランチからロールをかぶれるリポジトリとブランチ(環境)まで絞る
デプロイ用ロールに管理者権限乗っ取られるとアカウント全体をやられるデプロイに要る権限だけ
本番のためにビルドし直す確かめていないものが本番に出る成果物を1つ作って使い回す
戻し方を試したことがないいざというときに戻せない試験環境で戻す練習をしておく
誰でも main に直接 push できるレビューを通らない変更が本番へ流れるmain を保護し、プルリクエストとレビューを必須にする

図のいちばん下の、緑の印の項目がこの章の守りのまとめです。鍵は OIDC、権限は最小、成果物は1つ、戻しは練習済み。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 18 / 20
  • よくある落とし穴
  • NG
  • アクセスキーを GitHub に保存する → 漏れたらそのまま本番に触られる
  • NG
  • 信頼ポリシーで sub を絞らない → 他のリポジトリやブランチからかぶれる
  • NG
  • デプロイ用のロールに管理者権限 → 乗っ取られると全部やられる
  • NG
  • 本番のためにビルドし直す → 確かめていないものが本番に出る
  • NG
  • 戻し方を試したことがない → いざというときに戻せない
  • OK
  • 鍵は OIDC、権限は最小、成果物は1つ、戻しは練習済み
  • ひらめき
  • パイプラインは本番に触れる強い権限を持つ。流せる人と権限を絞ることが本番の守り。

片付け:練習で作ったパイプラインを消す

この章で練習のために作ったものを、次の順で消します。

番号消すもの注意
1デプロイ用の IAM ロール権限の強いロールを残しておかない
2OIDC の ID プロバイダー他のロールで使っていなければ消す
3CodePipeline・CodeBuild使った場合
4成果物S3 のバケットの中身、古い AMI
5古い組ブルー/グリーンで残ったブルーの組
6GitHub のワークフローファイルを消すか、無効にする

古い AMI は、登録を解除(deregister)した後に、その AMI が使っていた EBS のスナップショット(第10章)も消す必要があります。解除だけでは、スナップショットの保存料がかかり続けます。

構成そのものの片付けは、第18章の cdk destroy です。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 19 / 20
  • 片付け:練習で作ったパイプラインを消す
  • 人
  • 鍵
  • 更新
  • IAM ロール
  • OIDC の ID プロバイダー
  • パイプライン
  • deploy-photolog
  • 他で使っていなければ
  • CodePipeline・CodeBuild
  • フォルダ
  • サーバー
  • コード
  • 成果物
  • 古い組
  • GitHub
  • S3 のバケット・古い AMI
  • 切り替え後のブルー
  • ワークフローのファイル
  • 古い AMI は、登録を解除した後にスナップショット(第10章)も消さないと保存料が残る
  • ひらめき
  • ロール・OIDC の設定・パイプライン・成果物のバケット・ブルー/グリーンで残った古い組を消す。

まとめ:届ける道を1本にし、鍵を置かない

この章では、アプリの新しい版を手で届ける怖さを、CI/CD で解決しました。

項目内容
CI/CDpush を合図に、ビルド・テスト・試験環境・承認・本番へ、毎回同じ道で流す
成果物1回だけ作り、名前を付けて、どの環境にも同じものを出す
GitHub Actionsリポジトリの中にワークフローを書き、まっさらなランナーで実行する
OIDCGitHub の身分証で IAM ロールをかぶる。長く生きる鍵をどこにも置かない
信頼ポリシーsub でリポジトリとブランチを絞る。ロールの権限は最小に
入れ替え方一斉(止まる)・ローリング(混ざる)・ブルー/グリーン(すぐ戻せる)・カナリア(一部から)
戻し方前の成果物をもう一度出す。アラームで自動に。DB の変更は新旧どちらでも動く形で

デプロイ用の鍵は、どこにも置かなくなりました。

でも、まだ置いてある秘密があります。フォトログのアプリが RDS に接続するためのパスワードです。今はどこに書いてあるでしょうか。アプリの設定ファイル? ユーザーデータ? CDK のコード? どれも、Git の履歴やログに残ってしまう場所です。次の第20章では、パスワードや API キーのような秘密を安全にしまう方法と、データを暗号化する仕組みを学びます。

  • AWS でサービスを作る 19 ― CI/CD:自動で届ける
  • 20 / 20
  • まとめ:届ける道を1本にし、鍵を置かない
  • CI/CD
  • push を合図に、ビルド・テスト・試験環境・本番へ自動で流す
  • 成果物
  • 1回だけ作り、名前を付けて、どの環境にも同じものを出す
  • OIDC
  • GitHub の身分証でロールをかぶる。長く生きる鍵を置かない
  • 信頼ポリシー
  • sub でリポジトリとブランチを絞る。権限は最小に
  • 入れ替え方
  • 一斉・ローリング・ブルー/グリーン・カナリア
  • 戻し方
  • 前の版をもう一度出す。DB の変更は新旧どちらでも動く形で
  • ひらめき
  • 次の第20章:鍵は置かなくなった。でも、アプリが DB に入るパスワードは、まだどこかに書いてある。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]