CloudFormationスタックのSNS通知が有効化について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。

今回は、AWS CloudFormationスタックにAmazon SNSトピックが関連付けられていない状態について、そのリスクと対策を解説します。

リスク

AWS CloudFormationは、AWSリソースのプロビジョニングと管理をコード(テンプレート)で行うためのサービスです。CloudFormationがスタックの作成、更新、削除などの操作を実行する際、そのプロセスにおけるイベント(リソースの作成完了、失敗、削除など)が生成されます。これらのイベントは、AWSコンソールの「スタックイベント」タブで確認できますが、リアルタイムでの監視や通知機能が組み込まれていない場合があります。

CloudFormationスタックにAmazon SNS(Simple Notification Service)トピックが関連付けられていない場合、以下のような重大なリスクが発生します。

  • スタックイベントの見落とし: スタックの実行中に、リソースの作成失敗や更新のロールバックといった重要なイベントが発生しても、リアルタイムで通知を受け取ることができません。これにより、問題の発見が遅れ、インフラストラクチャのデプロイや更新プロセスが停滞する可能性があります。
  • 緊急時の対応遅延: 特に本番環境のデプロイやアップデートで問題が発生した場合、手動でCloudFormationコンソールを確認するまでその事実に気づかない可能性があります。これにより、障害の根本原因の特定や復旧作業が遅れ、サービスレベルアグリーメント(SLA)違反につながるリスクが高まります。
  • 運用効率の低下: 大規模なインフラストラクチャや多数のスタックを管理する場合、すべてのイベントを常に手動で監視することは非効率的です。SNS通知がないと、デプロイの成功・失敗を自動的に把握できず、DevOpsパイプラインの自動化が困難になります。
  • 監査証跡の不備: スタックのイベントは重要な監査証跡となりますが、通知が設定されていない場合、特定のイベントの発生を見逃しやすくなります。これにより、セキュリティインシデント発生時の調査やコンプライアンス監査が困難になる可能性があります。

対策

CloudFormationスタックにAmazon SNSトピックを関連付けることは、上記のすべてのリスクを軽減し、スタックのデプロイと運用の健全性を確保するための重要なベストプラクティスです。

  • リアルタイム通知の実現: スタックイベントが発生すると、SNSトピックにメッセージが発行されます。これにより、メール、SMS、Lambda関数、HTTPエンドポイントなど、様々な方法でリアルタイムに通知を受け取ることができます。
  • 迅速な問題対応: スタックの失敗や重要なステータス変更を即座に通知することで、問題発生時の対応時間を大幅に短縮できます。
  • 監視と自動化の強化: SNSトピックをLambda関数と連携させることで、特定のイベント(例: スタックの作成失敗)をトリガーに、自動的にログを収集したり、別の自動化スクリプトを実行したりすることができます。これにより、より高度な監視と自動修復の仕組みを構築できます。
  • 運用フローの改善: DevOpsパイプラインにおいて、デプロイの成功・失敗を自動的に通知することで、次のステップに進むか、またはロールバックを開始するかを自動的に判断できるようになります。

修復方法

AWS CloudFormationスタックにSNSトピックを関連付ける方法は、AWSコンソールまたはTerraformで行えます。ここでは、新しいSNSトピックを作成し、既存のスタックに関連付ける手順を説明します。

AWSコンソールでの修復手順

AWSコンソールを使用して、SNSトピックを作成し、CloudFormationスタックの更新時にそのトピックを関連付けます。

ステップ 1: SNSトピックを作成する

  1. SNSサービスへ移動: AWSコンソールにログインし、Amazon SNS サービスを開きます。
  2. トピックの作成: 左側のナビゲーションペインで「トピック」を選択し、「トピックを作成」をクリックします。
  3. トピックの設定:
    • タイプ: 「スタンダード」を選択します。
    • 名前: トピック名(例: MyCloudFormationNotificationTopic)を入力します。
    • アクセス設定: 適切なアクセスポリシーを設定します。CloudFormationがメッセージを公開できるように、IAMロールやAWSアカウントにsns:Publish権限を付与する必要があります。
  4. サブスクリプションの作成:
    • トピック作成後、通知を受け取りたい方法(例: Eメール)でサブスクリプションを作成します。
    • プロトコルで「Eメール」を選択し、通知を受け取りたいメールアドレスを入力して、「サブスクリプションを作成」をクリックします。
    • メールアドレスに届く確認メールのリンクをクリックして、サブスクリプションを確定します。

ステップ 2: CloudFormationスタックに関連付ける

  1. CloudFormationサービスへ移動: AWSコンソールでCloudFormation サービスを開きます。
  2. スタックの更新:
    • 通知を設定したいスタックを選択し、「更新」をクリックします。
  3. 「スタックオプション」の設定:
    • テンプレートの更新」で「現在のテンプレートを使用」を選択し、「次へ」をクリックします。パラメータ設定をそのままにして「次へ」をクリックし、「スタックオプションの設定」画面に移動します。「通知オプション」セクションまでスクロールします。
  1. SNSトピックの選択:
    • Amazon SNSトピック」のドロップダウンメニューから、ステップ1で作成したSNSトピックを選択します。
    • 重要: 複数のトピックをカンマ区切りで指定することも可能です。
  2. 変更のレビューと更新:
    • 次へ」をクリックし、変更内容を確認します。
    • スタックの更新」をクリックして変更を適用します。

これで、スタックの実行中にイベントが発生すると、設定したSNSトピックを経由して通知が届くようになります。

Terraformでの修復手順

TerraformでCloudFormationスタックにSNSトピックを関連付けるには、aws_cloudformation_stack リソースの notification_arns パラメータを使用します。

# (前提) CloudFormationテンプレート、その他リソースは別途定義

# Step 1: SNS トピックの作成
resource "aws_sns_topic" "cloudformation_notification_topic" {
  name = "MyCloudFormationNotificationTopic"
  tags = {
    Name = "CloudFormationNotificationTopic"
  }
}

# SNSトピックへのEメールサブスクリプション
resource "aws_sns_topic_subscription" "email_subscription" {
  topic_arn = aws_sns_topic.cloudformation_notification_topic.arn
  protocol  = "email"
  endpoint  = "your-email@example.com" # 通知を受け取りたいメールアドレスに置き換え
}

# Step 2: IAMポリシーでCloudFormationがSNSにPublishする権限を付与
resource "aws_iam_role_policy" "cfn_sns_publish_policy" {
  name = "cfn-sns-publish-policy"
  role = aws_iam_role.cloudformation_service_role.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = "sns:Publish"
        Resource = aws_sns_topic.cloudformation_notification_topic.arn
      }
    ]
  })
}

# (前提) CloudFormationのサービスロール
resource "aws_iam_role" "cloudformation_service_role" {
  name = "cloudformation-service-role"
  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Action = "sts:AssumeRole",
        Effect = "Allow",
        Principal = {
          Service = "cloudformation.amazonaws.com"
        }
      }
    ]
  })
}

# Step 3: CloudFormation スタックに SNS トピックを関連付ける
resource "aws_cloudformation_stack" "my_secure_stack" {
  name = "MySecureStack"
  # YAMLまたはJSONテンプレート
  template_body = file("template.yaml")
  
  # **重要: SNSトピックのARNをnotification_arnsに指定**
  notification_arns = [aws_sns_topic.cloudformation_notification_topic.arn]

  # CloudFormationにAssumeRoleさせるIAMロール
  iam_role_arn = aws_iam_role.cloudformation_service_role.arn

  parameters = {
    # テンプレートのパラメータを指定
  }
  
  tags = {
    Name = "MySecureStack"
  }
}

上記のTerraformコードでは、aws_cloudformation_stack リソースの notification_arns パラメータに、aws_sns_topic リソースのARNを指定することで、CloudFormationスタックとSNSトピックを関連付けています。

  • aws_sns_topic: 通知用のSNSトピックを作成します。
  • aws_sns_topic_subscription: 通知を受け取るエンドポイント(Eメールアドレスなど)をサブスクライブします。
  • aws_cloudformation_stack.notification_arns: このリストに、作成したSNSトピックのARN (aws_sns_topic.cloudformation_notification_topic.arn) を追加します。

この設定を適用することで、CloudFormationスタックのイベントが自動的にSNSトピックに発行され、設定されたサブスクライバーに通知が届くようになります。

最後に

この記事では、AWS CloudFormationスタックにSNSトピックを関連付けることの重要性について解説しました。この設定は、スタックのデプロイ状況をリアルタイムで把握し、問題発生時の対応を迅速化し、運用の自動化を促進する上で不可欠です。 貴社のCloudFormationスタックは、重要なイベントを通知するように設定されていますか?この機会にぜひ設定を確認・強化してみてください。 こちらの内容の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。運用が非常にラクに出来る製品になっていますのでぜひ興味がある方はお問い合わせお待ちしております。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る