Amazon SNS トピックの発行またはサブスクライブができないのはなぜですか?

最終更新日: 2021 年 11 月 4 日

Amazon Simple Notification Service (Amazon SNS) トピックの発行またはサブスクライブができません。この問題をトラブルシューティングするにはどうすればよいですか?

簡単な説明

AWS Identity and Access Management (IAM) リソースまたはアイデンティティは、必要な許可がないと Amazon SNS トピックを発行またはサブスクライブできません。

Amazon SNS トピックの発行またはサブスクライブに必要な IAM 許可を付与するには、ユースケースに基づいて次のいずれかを実行します。

注: Amazon SNS は、IAM アイデンティティベースと Amazon SNS リソースベースのアクセスポリシーを併用して、SNS トピックへのアクセス権を付与します。IAM ポリシーを使用して、Amazon SNS アクションおよびトピックへのユーザーまたはロールのアクセスを制限できます。IAM ポリシーは、お客様の AWS アカウントのユーザーのアクセスのみを制限し、他の AWS アカウントのアクセスは制限しません。詳細については、IAM ポリシーと Amazon SNS ポリシーを一緒に使うを参照してください。

解決方法

Amazon SNS トピックに発行する許可を別の AWS のサービスに付与するには

Amazon SNS トピックのリソースベースのポリシーは、他の AWS のサービスがトピックにメッセージを発行することを許可する必要があります。トピックのアクセスポリシーを確認して必要な許可があることを確認し、必要に応じて追加してください。

必要な許可を追加するには、Amazon SNS トピックのアクセスポリシーを編集して、以下の許可ステートメントが含まれるようにします。

{
    "Sid": "Allow-AWS-Service-to-publish-to-the-topic",
    "Effect": "Allow",
    "Principal": {
        "Service": "service.amazonaws.com"
    },
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName"
}

重要: これらの許可により、SNS トピックの Amazon リソースネーム (ARN) にアクセスできるユーザーは誰でも、サービスエンドポイントを介してトピックにメッセージを発行できます。グローバル条件キーを追加して、公開許可を特定のリソースに制限できます。次の例では、arnLike 条件演算子と aws:SourceArn グローバル条件キーを使用しています。詳細については、Amazon SNS アクセスコントロールのケース例を参照してください。

Amazon SNS の発行許可を特定のリソースに制限する IAM ポリシーの例

重要: <region> をリソースの AWS リージョンに置き換えてください。<account-id> をご使用のアカウント ID に置き換えます。<resource-name> をリソース名に置き換えてください。

{
    "Sid": "Allow-AWS-Service-to-publish-to-the-topic",
    "Effect": "Allow",
    "Principal": {
        "Service": "service.amazonaws.com"  
    },
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName",
    "Condition": {
        "ArnLike": {
            "aws:SourceArn": "arn:aws:<service>:<region>:<account-id>:<resource-type>:<resource-name>"
        }
    }
}

注: Amazon S3 は FIFO SNS トピックをサポートしていません。トピックポリシーに S3 ARN がある場合は、それがバケットフォルダへのパスではないことを確認します。例: arn:aws:s3:*:*:mys3-bucket/*

IAM ユーザーまたはロールが Amazon SNS トピックをサブスクライブして発行することを許可するには

デフォルトでは、トピックを発行またはサブスクライブできるのはトピックの所有者のみです。他の IAM エンティティがトピックにサブスクライブして発行できるようにするには、トピックのアイデンティティベースのポリシーで必要な許可を付与する必要があります。

重要: IAM エンティティのポリシーと SNS トピックのアクセスポリシーのいずれも、SNS リソースへのアクセスを明示的に拒否していないことを確認してください。詳細については、明示的な拒否と暗黙的な拒否の違いを参照してください。

IAM エンティティと SNS トピックが異なる AWS アカウントにある場合

次の両方を実行します。

1.    「sns:Subscribe」および「sns:Publish」アクションの実行をエンティティに許可する IAM エンティティに IAM ポリシーステートメントをアタッチします。手順については、IAM アイデンティティの許可の追加および削除を参照してください。

IAM エンティティが SNS トピックにサブスクライブして発行することを許可する IAM アイデンティティベースのポリシーの例を以下に示します。

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sns:Publish",
                "sns:Subscribe"
            ],
            "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName"
        }
    ]
}

2.    「sns:Subscribe」および「sns:Publish」アクションの実行を IAM エンティティに許可するトピックのアクセスポリシーに SNS ポリシーステートメントをアタッチします。手順については、Amazon SNS トピックのアクセスポリシーを編集するにはどうすればよいですか? を参照してください。

IAM エンティティが SNS トピックにサブスクライブして発行することを許可する Amazon SNS トピックのアクセスポリシーの例を以下に示します。

{
    "Statement": [
        {
            "Sid": "Allow-SNS-Permission",
            "Effect": "Allow",
            "Principal": {
                "AWS": "111122223333"
            },
            "Action": [
                "sns:Publish",
                "sns:Subscribe"
            ],
            "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName"
        }
    ]
}

注: Principal は、IAM アイデンティティベースのユーザーもしくはロール、または AWS アカウント番号にすることができます。詳細については、AWS JSON ポリシーの要素: Principal を参照してください。

IAM エンティティと SNS トピックが同じアカウントにある場合

次のいずれかを実行します。両方は実行しないでください。

「sns:Subscribe」および「sns:Publish」アクションの実行をエンティティに許可する IAM エンティティに IAM ポリシーステートメントをアタッチします。

- または -

「sns:Subscribe」および「sns:Publish」アクションの実行を IAM エンティティに許可するトピックのアクセスポリシーに SNS ポリシーステートメントをアタッチします。

ポリシーステートメントの例については、この記事の「IAM エンティティと SNS トピックが異なる AWS アカウントにある場合」のセクションを参照してください。

(サーバー側の暗号化 (SSE) がアクティブ化されているトピックの場合) トピックに必要な AWS Key Management (AWS KMS) 許可があることを確認する

トピックで SSE が有効化されている場合、Amazon SNS トピックでは、カスタマーマネージドの AWS KMS キーを使用する必要があります。この KMS キーには、十分なキー使用許可を他の AWS のサービスに付与するカスタムキーポリシーを含める必要があります。

以下の許可が最小要件です。
"kms:Decrypt"
"kms:GenerateDataKey*"

必要な AWS KMS 許可をセットアップするには、以下の手順を実行します。

1.    他の AWS のサービスに必要な許可を含むカスタマーマネージドの新しい KMS キーを作成します。

2.    先ほど作成したカスタム KMS キーを使用して、Amazon SNS トピックの SSE を設定します。

3.    他の AWS のサービスが暗号化されたトピックへにメッセージを発行することを許可する AWS KMS 許可を設定します。

別の AWS のサービスが暗号化された SNS トピックにメッセージを発行することを許可する IAM ポリシーステートメントの例

{
    "Sid": "Allow-a-service-to-use-this-key",
    "Effect": "Allow",
    "Principal": {
        "Service": "service.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*"
    ],
    "Resource": "*"
}