インフラを「コード」ではなく「資産」にする:GitHub Actions × CloudFormationによる究極のCI/CD構築術
手作業でマネジメントコンソールをポチポチする時代は終わった。真のインフラエンジニアは、指先ひとつで環境を錬成し、パイプラインという名の自動化エンジンに全てを委ねる。
今回は、AWS CloudFormation(以下CFn)をGitHub Actionsで完全自動化し、デプロイの恐怖を「退屈な日常」に変えるための戦略を伝授する。これは単なる構築手順ではない。君のチームの生産性を、次のステージへ押し上げるための設計図だ。
—
1. なぜ「CI/CD導入」が必須なのか?
単なる「自動化」と「CI/CD」は別物だ。CI/CDの真髄は「失敗の早期発見」と「変更に対する心理的障壁の排除」にある。
- 冪等性の担保: 誰が、いつ実行しても同じ結果が得られる状態。これがなければIaCではない。
- レビューの強制: コードを通さずインフラをいじらせない。GitHubのPull Request(PR)こそが唯一の正義だ。
- 品質の平準化: 人間の「うっかり」を `cfn-lint` が排除する。
—
2. 【核心】OIDCによるセキュアなAWS認証
かつては `AWS_ACCESS_KEY_ID` などをGitHub Secretsに埋め込んでいたが、それはもう「過去の遺物」だ。鍵漏洩のリスクをゼロにするOIDC(OpenID Connect)を導入せよ。
AWS側の設定(TerraformやAWS CLIで定義)
GitHub Actions専用の `IAM OIDC Provider` を作成し、信頼関係を定義する。
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Principal”: { “Federated”: “arn:aws:iam::[ACCOUNT_ID]:oidc-provider/token.actions.githubusercontent.com” },
“Action”: “sts:AssumeRoleWithWebIdentity”,
“Condition”: {
“StringEquals”: {
“token.actions.githubusercontent.com:aud”: “sts.amazonaws.com”
},
“StringLike”: {
“token.actions.githubusercontent.com:sub”: “repo:[ORG]/[REPO]:ref:refs/heads/main”
}
}
}
]
}
—
3. GitHub Actions:ベストプラクティス・ワークフロー
PR作成時に静的解析を走らせ、マージ時にデプロイを行う。これが鉄板だ。
`.github/workflows/deploy.yml`
name: CFn Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
id-token: write # OIDC認証に必須
contents: read
jobs:
lint-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Linting
run: |
pip install cfn-lint
cfn-lint templates/.yaml # 構文エラーを即座に検知
deploy:
if: github.event_name == ‘push’
needs: lint-and-test
runs-on: ubuntu-latest
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::[ACCOUNT_ID]:role/GitHubActionsRole
aws-region: ap-northeast-1
- name: Deploy CloudFormation
run: |
aws cloudformation deploy \
–template-file templates/stack.yaml \
–stack-name my-infra-stack \
–capabilities CAPABILITY_IAM \
–no-fail-on-empty-changeset # 変更がない場合のエラー終了を防ぐ
—
4. プロが現場で使う「神テクニック」
① cfn-lint の最強設定
プロジェクトルートに `.cfnlintrc` を置き、チーム全体でルールを統一せよ。これを怠ると、コード規約の些末な言い争いで時間が溶ける。
.cfnlintrc
templates:
- templates/
ignore_checks:
- W3002 # 特定の警告を抑制
include_checks:
- I # インデント等の厳格チェック
② 開発スピードを加速するVSCodeプラグイン
- CloudFormation Linter: ファイル編集中にリアルタイムでバリデーションしてくれる。
- YAML: 言わずもがな。インデントのズレはインフラ事故の元。
③ 隠れたキーボードショートカット(VSCode)
- `Ctrl + Shift + O`: シンボル検索。大規模なテンプレートファイルで特定のリソースへ瞬時に飛ぶ。
- `Alt + Shift + F`: フォーマッタ実行。コードの美しさは「冪等性の維持」に直結する。
—
5. チーム開発における「ルール」
1. スタックは小さく刻め: 巨大なモノリス・スタックは変更の恐怖を最大化する。機能ごとにスタックを分割し、`Export/ImportValue` または `SSM Parameter Store` で疎結合に繋ぐこと。
2. パラメータファイルは環境ごとに分ける: `params/dev.json`, `params/prod.json` のように管理し、コマンド実行時に `–parameter-overrides` で動的に注入する。
3. ドリフト検知をサボるな: 誰かが手動で変更していないか、定期的に `aws cloudformation detect-stack-drift` を実行するジョブをcronで回せ。
最後に:エンジニアの誇り
インフラ構築は「作業」ではない。「コードによるアーキテクチャの定義」だ。このCI/CDパイプラインを構築することは、君自身の時間を解放し、チームのポテンシャルを最大化する投資である。
一度構築すれば、それは君の分身となって24時間365日、ミスなく安全にインフラを更新し続けてくれる。さあ、今すぐコードを書き始めよう。未来の君が、今の君に感謝することになるはずだ。