Terraformで配信ステータスのロギングを有効化したSNSトピックを作成する

配信ステータスのロギングを有効化したSNSトピックを作成した際のTerraformのサンプルコードを紹介します
2022.11.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

ネクストモードの南です。

先日配信ステータスのロギングを有効化したSNSトピックを作成する機会があり、Terraformで作成をしました。備忘も兼ねて記事にまとめます。

概要

SNSでは以下の配信プロトコルを対象に、配信ステータス機能を使用することでメッセージ配信の成功、失敗に関する情報を収集することができます。収集した配信ステータスの情報は、CloudWatch Logsのロググループに記録されます。

  • HTTP
  • Amazon Kinesis Data Firehose
  • AWS Lambda
  • プラットフォームアプリケーションエンドポイント
  • Amazon SQS

今回は配信ステータスのロギングに関わる部分にフォーカスしてサンプルコードを紹介します。

サンプルコード

SNSトピックとCloudWatch Logsのロググループ、また、ロググループへの書き込みに必要となるIAMロールのサンプルコードが以下となります。

配信ステータスロギングを有効化するプロトコル、成功率の閾値については要件に合わせてカスタマイズしてください。
以下のサンプルではSQSを配信プロトコルとして指定したケースを想定して記載しています。

sns.tf

resource "aws_sns_topic" "test-topic" {
  name         = "test-topic"
  display_name = "test-topic"

  ## 配信ステータスログ設定 必要なプロトコルにのみ適宜変更する
  # SQS用
  sqs_success_feedback_role_arn = aws_iam_role.sns-successfeedback.arn
  sqs_failure_feedback_role_arn = aws_iam_role.sns-failurefeedback.arn
  sqs_success_feedback_sample_rate = 100
  
  # HTTP/S用
  #http_success_feedback_role_arn = aws_iam_role.sns-successfeedback.arn
  #http_failure_feedback_role_arn = aws_iam_role.sns-failurefeedback.arn
  #http_success_feedback_sample_rate = 100

  # Lambda用
  #lambda_success_feedback_role_arn = aws_iam_role.sns-successfeedback.arn
  #lambda_failure_feedback_role_arn = aws_iam_role.sns-failurefeedback.arn
  #lambda_success_feedback_sample_rate = 100

  # Kinesis Firehose用
  #firehose_success_feedback_role_arn = aws_iam_role.sns-successfeedback.arn
  #firehose_failure_feedback_role_arn = aws_iam_role.sns-failurefeedback.arn
  #firehose_success_feedback_sample_rate = 100

  # Platform application endpoint用
  #application_success_feedback_role_arn = aws_iam_role.sns-successfeedback.arn
  #application_failure_feedback_role_arn = aws_iam_role.sns-failurefeedback.arn
  #application_success_feedback_sample_rate = 100
}

cwlogs.tf

# Success用ロググループ
resource "aws_cloudwatch_log_group" "logs-sns-success" {
  name              = "sns/ap-northeast-1/[Account ID]/test-topic"
  retention_in_days = 30
}

# Failure用ロググループ
resource "aws_cloudwatch_log_group" "logs-sns-failure" {
  name              = "sns/ap-northeast-1/[Account ID]/test-topic/Failure"
  retention_in_days = 30
}

iam.tf

# Success用ロール
resource "aws_iam_role" "sns-successfeedback" {
  name = "role-sns-successfeedback"

  assume_role_policy = <<POLICY
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "sns.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
POLICY
}

resource "aws_iam_policy" "sns-successfeedback" {
  name = "policy-sns-successfeedback"
  policy = <<POLICY
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:PutMetricFilter",
                "logs:PutRetentionPolicy"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
POLICY
}

resource "aws_iam_role_policy_attachment" "sns-successfeedback" {
  role       = aws_iam_role.sns-successfeedback.name
  policy_arn = aws_iam_policy.sns-successfeedback.arn
}

# Failure用ロール
resource "aws_iam_role" "sns-failurefeedback" {
  name = "role-sns-failurefeedback"

  assume_role_policy = <<POLICY
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "sns.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
POLICY
}

resource "aws_iam_policy" "sns-failurefeedback" {
  name = "policy-sns-failurefeedback"
  policy = <<POLICY
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:PutMetricFilter",
                "logs:PutRetentionPolicy"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
POLICY
}

resource "aws_iam_role_policy_attachment" "sns-failurefeedback" {
  role       = aws_iam_role.sns-failurefeedback.name
  policy_arn = aws_iam_policy.sns-failurefeedback.arn
}

マネジメントコンソールから配信ステータスのロギングを有効化した場合は、IAMロールも連動して新規作成することができます。 (SNSSuccessFeedback、SNSFailureFeedbackというロール名で作成される。)
サンプルコードではマネジメントコンソールから作成した場合と同一の設定となるように記述しています。

また、ロググループについては配信ステータスのログが出力されたタイミングで自動的に作成されるため、あえてTerraformから作成しなくても問題ありません。ただ、その場合はデフォルトの設定で作成されるので、保存期間を変更するなどの要件がある場合にはTerraformで一緒に作成したほうが効率がいいです。

試しにSNSトピックからSQSに配信をしてみると、ロググループに配信ステータス情報が記録されていることが確認できます。

  • メッセージ配信成功の場合

  • メッセージ配信失敗の場合

参考

Amazon SNS メッセージ配信ステータス

ネクストモードについて

ネクストモード株式会社は東日本電信電話株式会社とクラスメソッド株式会社で設立したクラウドカンパニーです。「クラウドであたらしい働き方を」というメッセージを掲げ、さまざまなクラウド技術や製品を組み合わせて企業の働き方の当たり前を変えていくことを目指しています。クラウドやSaaSのご利用に関してお困りごとがあれば、ネクストモードまでぜひお問い合わせください。