手動のクラウド管理はもうやめよう:Cloud Custodian導入ガイド

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

手動監査の罠:なぜクラウドスプロールが生産性を低下させるのか

クラウドインフラストラクチャの拡張スピードは、チームの追跡能力を上回ります。ある週は10個のEC2インスタンスを管理していたと思えば、次の週にはAWS、Azure、GCPにまたがる数百ものアカウントに組織が急拡大している、といった具合です。

私は、シニアDevOpsエンジニアが金曜日の全時間を費やして、暗号化されていないS3バケットを探したり、数ヶ月前に忘れ去られた「ゾンビ」ディスクを削除したりする姿を見てきました. AWSの1TBのgp3ボリュームが放置されているだけで、何もしていないのに月額約80ドルかかります。これが10リージョンで50ボリュームあれば、毎月4,000ドルをデジタルのゴミに費やしていることになります。

この摩擦の主な原因は、集約され自動化された強制力の欠如にあります。エンジニアに50ページの「ベストプラクティス」PDFを暗記させるのは、失敗への近道です. ヒューマンエラーは避けられません。コントロールを維持するには、これらのガイドラインを実行可能なコードに変換する必要があります。ここで、Cloud Custodian (c7n) が最も価値のあるDevOpsツールとなります。

クイックスタート:5分で最初のポリシーをデプロイする

Cloud Custodianは、YAMLを使用してインフラストラクチャポリシーを定義するオープンソースのルールエンジンです。非常に軽量で、実行のために大規模なサーバークラスターを管理する必要はありません。ローカルのノートPCや基本的なCI/CDランナーがあれば十分です。

1. インストール

Cloud CustodianはPythonベースであるため、仮想環境(venv)を使用してワークスペースをクリーンに保つのが最善です。

python3 -m venv custodian-venv
source custodian-venv/bin/activate
pip install c7n

2. セキュリティポリシーの作成

encrypt-buckets.ymlという名前のファイルを作成します。このポリシーは、AES-256またはKMS暗号化が設定されていないS3バケットをスキャンし、警告タグを付与します。これは、セキュリティ体制を破壊せずに監査する手法です。

policies:
  - name: s3-unencrypted-report
    resource: s3
    filters:
      - type: no-encryption
    actions:
      - type: tag
        key: SecurityStatus
        value: NonCompliant

3. 監査の実行

AWSアカウントに対してポリシーを実行します。開始前に、ターミナルセッションで認証情報がエクスポートされていることを確認してください。

custodian run --output-dir=. encrypt-buckets.yml

Custodianはresources.jsonファイルを生成します。このファイルには、チェックに合格しなかったすべてのバケットがリストされます。AWSコンソールを何時間もクリックし続ける必要はもうありません。

3つの柱:ポリシーの構成要素

すべてのCloud Custodianポリシーは、論理的な3部構成になっています。クラウドインフラに対する「If-This-Then-That(もしこれなら、あれをする)」と考えてください。

  • Resource(リソース): 対象となるアセット(例: aws.ec2azure.vm、または gcp.instance)。
  • Filter(フィルター): 選択のための特定の基準。「60日以上経過したインスタンス」や「所有者が設定されていないディスク」などを指定できます。
  • Action(アクション): 実行する処理。停止、削除、タグ付け、あるいはリソース作成者へのSlack通知などが可能です。

本番環境では、私はこのロジックを使用して、毎週日曜日の夜に放置されたEBSボリュームを処理しています。これは、「クラウドの墓場」が四半期予算を食いつぶすのを防ぐ簡単な方法です。

実践:マルチクラウドガバナンス

Cloud Custodianは、プロバイダー固有のAPIを統一された構文に抽象化します。つまり、マルチクラウド環境を管理するために3つの異なるCLIツールを学ぶ必要はありません。

AWS:コスト削減の自動化

開発環境は週末も稼働し続け、60時間以上のコンピューティング時間を浪費しがちです。このポリシーは、Env: Devタグが付いたインスタンスをターゲットにし、午後6時にシャットダウンします。

policies:
  - name: ec2-nightly-stop
    resource: ec2
    filters:
      - type: value
        key: "tag:Env"
        value: Dev
      - type: schedule
        # 午後6時に停止するスケジュール設定
        schedule: "stop"
        default_tz: "utc"
    actions:
      - stop

Azure:管理ディスクのクリーンアップ

Azureでは、親機となるVMを削除した後も管理ディスクの課金が継続されます。このポリシーは、接続されていない(Unattached)ディスクを自動的に見つけて削除します。

policies:
  - name: azure-cleanup-unattached-disks
    resource: azure.disk
    filters:
      - type: value
        key: properties.diskState
        op: eq
        value: Unattached
    actions:
      - type: delete

安心して運用するための本番戦略

インフラを削除できるツールを実行するのは、当然ながら不安が伴います。予期せぬ停止を避けるため、私は厳格なデプロイワークフローに従っています。

「Dry Run」というセーフティネット

新しいポリシーをいきなり「ライブ」モードで実行しないでください。--dryrunフラグを使用しましょう。これにより、実際に変更を加えることなく、どのリソースが影響を受けるかを正確にシミュレートできます。

# 実際に変更を加えず実行結果をシミュレートする
custodian run --dryrun --output-dir=out policy.yml

「通知と待機」の猶予期間

突然の削除は開発者を混乱させます。即座にアクションを起こすのではなく、2段階のポリシーを作成しましょう。最初のポリシーで非準拠のリソースにタグを付け、Slackアラートを送信します。72時間の猶予期間を経ても非準拠のままであれば、2番目のポリシーで削除を実行します。

CI/CDへの統合

長期的なガバナンスを個人のノートPCで行うべきではありません。YAMLポリシーをGitリポジトリに移行しましょう。GitHub ActionsやGitLab CIを使用して、これらのポリシーをスケジュール実行します。例えば、セキュリティチェックは1時間ごと、コストクリーンアップは週に1回といった運用が考えられます。

最後に

クラウドガバナンスは「インフラ警察」を演じることではありません。開発者が玄関を開けっぱなしにすることなく、迅速に行動できるようにするための「ガードレール」を構築することです。ポリシーをコードとして扱うことで、請求額に驚いてから対処するのではなく、意図を持ってクラウドを管理できるようになります。Cloud Custodianは、混沌とした環境を、予測可能で自動化されたエコシステムへと変えてくれます。

Share: