本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon SNS 訊息傳遞狀態
Amazon SNS 使用下列 Amazon SNS 端點,提供將傳送至主題之通知訊息的交付狀態予以記錄的支援。
設定郵件傳遞狀態屬性之後,會針對傳送給主題訂閱者的郵件,將 CloudWatch 記錄項目傳送至記錄檔。記錄訊息傳遞狀態有助於提供深入的營運見解,例如下列項目:
-
得知訊息是否已傳遞至 Amazon SNS 端點。
-
識別從 Amazon SNS 端點傳送至 Amazon SNS 的回應。
-
判定訊息暫留時間 (發布時間戳記到就在遞交至 Amazon SNS 端點前的時間)。
若要設定郵件傳遞狀態的主題屬性,您可以使用 AWS Management Console, AWS 軟體開發套件 (SDK)、查詢 API 或 AWS CloudFormation.
使用 AWS Management Console設定交付狀態記錄日誌
登入 Amazon SNS 主控台。
-
在導覽面板上,選擇 Topics (主題)。
-
在 Topics (主題) 頁面上,選擇主題,然後選擇 Delete (刪除)。
-
在 [編輯] MyTopic
頁面上,展開 [傳送狀態記錄] 區段。
-
選擇您希望記錄交付狀態日誌的通訊協定,例如 AWS Lambda。
-
輸入成功取樣率 (您要接收 CloudWatch 記錄檔的成功訊息百分比)。
-
在 IAM roles (IAM 角色) 子區段中,執行以下其中一項作業:
-
選擇儲存變更。
您現在可以檢視和剖析包含郵件傳遞狀態的 CloudWatch 記錄檔。如需使用的詳細資訊 CloudWatch,請參閱CloudWatch文件。
使用 AWS SDK 設定傳送狀態記錄
AWS 開發套件提供多種語言的 API,可將訊息傳遞狀態屬性與 Amazon SNS 搭配使用。
主題屬性
您可以使用下列訊息傳遞狀態的主題屬性名稱值:
HTTP
-
HTTPSuccessFeedbackRoleArn
- 表示訂閱 HTTP 端點之 Amazon SNS 主題的成功訊息傳遞狀態。
-
HTTPSuccessFeedbackSampleRate
- 表示訂閱 HTTP 端點之 Amazon SNS 主題的訊息範例成功百分比。
-
HTTPFailureFeedbackRoleArn
- 表示訂閱 HTTP 端點之 Amazon SNS 主題的失敗訊息傳遞狀態。
Amazon 數據 Firehose
-
FirehoseSuccessFeedbackRoleArn
- 表示訂閱 Amazon Kinesis Data Firehose 端點之 Amazon SNS 主題的成功訊息傳遞狀態。
-
FirehoseSuccessFeedbackSampleRate
- 表示訂閱 Amazon Kinesis Data Firehose 端點之 Amazon SNS 主題的訊息範例成功百分比。
-
FirehoseFailureFeedbackRoleArn
- 表示訂閱 Amazon Kinesis Data Firehose 端點之 Amazon SNS 主題的失敗訊息傳遞狀態。
AWS Lambda
-
LambdaSuccessFeedbackRoleArn
- 表示訂閱 Lambda 端點之 Amazon SNS 主題的成功訊息傳遞狀態。
-
LambdaSuccessFeedbackSampleRate
- 表示訂閱 Lambda 端點之 Amazon SNS 主題的訊息範例成功百分比。
-
LambdaFailureFeedbackRoleArn
- 表示訂閱 Lambda 端點之 Amazon SNS 主題的失敗訊息傳遞狀態。
平台應用程式端點
-
ApplicationSuccessFeedbackRoleArn
— 指出訂閱 AWS 應用程式端點之 Amazon SNS 主題的成功訊息傳遞狀態。
-
ApplicationSuccessFeedbackSampleRate
— 針對訂閱 AWS 應用程式端點的 Amazon SNS 主題,指出要取樣的成功訊息百分比。
-
ApplicationFailureFeedbackRoleArn
— 指出訂閱 AWS 應用程式端點之 Amazon SNS 主題的失敗訊息傳遞狀態。
Amazon SQS
-
SQSSuccessFeedbackRoleArn
- 表示訂閱 Amazon SQS 端點之 Amazon SNS 主題的成功訊息傳遞狀態。
-
SQSSuccessFeedbackSampleRate
- 表示訂閱 Amazon SQS 端點之 Amazon SNS 主題的訊息範例成功百分比。
-
SQSFailureFeedbackRoleArn
- 表示訂閱 Amazon SQS 端點之 Amazon SNS 主題的失敗訊息傳遞狀態。
<ENDPOINT>SuccessFeedbackRoleArn
和<ENDPOINT>FailureFeedbackRoleArn
屬性用於授與 Amazon SNS 寫入存取權,以代表您使用 CloudWatch 日誌。<ENDPOINT>SuccessFeedbackSampleRate
屬性用於指定成功傳送訊息的取樣率百分比 (0-100)。設定<ENDPOINT>FailureFeedbackRoleArn
屬性之後,所有失敗的郵件傳遞都會產生 CloudWatch 記錄檔。
AWS 用於配置主題屬性的 SDK 示例
下列程式碼範例會示範如何使用SetTopicAttributes
。
- CLI
-
- AWS CLI
-
設定主題的屬性
下列 set-topic-attributes
範例會設定指定主題的 DisplayName
屬性。
aws sns set-topic-attributes \
--topic-arn arn:aws:sns:us-west-2:123456789012:MyTopic \
--attribute-name DisplayName \
--attribute-value MyTopicDisplayName
此命令不會產生輸出。
- Java
-
- 適用於 Java 2.x 的 SDK
-
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.SetTopicAttributesRequest;
import software.amazon.awssdk.services.sns.model.SetTopicAttributesResponse;
import software.amazon.awssdk.services.sns.model.SnsException;
/**
* Before running this Java V2 code example, set up your development
* environment, including your credentials.
*
* For more information, see the following documentation topic:
*
* https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
*/
public class SetTopicAttributes {
public static void main(String[] args) {
final String usage = """
Usage: <attribute> <topicArn> <value>
Where:
attribute - The attribute action to use. Valid parameters are: Policy | DisplayName | DeliveryPolicy .
topicArn - The ARN of the topic.\s
value - The value for the attribute.
""";
if (args.length < 3) {
System.out.println(usage);
System.exit(1);
}
String attribute = args[0];
String topicArn = args[1];
String value = args[2];
SnsClient snsClient = SnsClient.builder()
.region(Region.US_EAST_1)
.build();
setTopAttr(snsClient, attribute, topicArn, value);
snsClient.close();
}
public static void setTopAttr(SnsClient snsClient, String attribute, String topicArn, String value) {
try {
SetTopicAttributesRequest request = SetTopicAttributesRequest.builder()
.attributeName(attribute)
.attributeValue(value)
.topicArn(topicArn)
.build();
SetTopicAttributesResponse result = snsClient.setTopicAttributes(request);
System.out.println(
"\n\nStatus was " + result.sdkHttpResponse().statusCode() + "\n\nTopic " + request.topicArn()
+ " updated " + request.attributeName() + " to " + request.attributeValue());
} catch (SnsException e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
}
}
- JavaScript
-
- 適用於 JavaScript (v3) 的開發套件
-
在單獨的模組中建立用戶端並將其匯出。
import { SNSClient } from "@aws-sdk/client-sns";
// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
匯入 SDK 和用戶端模組,然後呼叫 API。
import { SetTopicAttributesCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";
export const setTopicAttributes = async (
topicArn = "TOPIC_ARN",
attributeName = "DisplayName",
attributeValue = "Test Topic",
) => {
const response = await snsClient.send(
new SetTopicAttributesCommand({
AttributeName: attributeName,
AttributeValue: attributeValue,
TopicArn: topicArn,
}),
);
console.log(response);
// {
// '$metadata': {
// httpStatusCode: 200,
// requestId: 'd1b08d0e-e9a4-54c3-b8b1-d03238d2b935',
// extendedRequestId: undefined,
// cfId: undefined,
// attempts: 1,
// totalRetryDelay: 0
// }
// }
return response;
};
- Kotlin
-
- 適用於 Kotlin 的 SDK
-
suspend fun setTopAttr(attribute: String?, topicArnVal: String?, value: String?) {
val request = SetTopicAttributesRequest {
attributeName = attribute
attributeValue = value
topicArn = topicArnVal
}
SnsClient { region = "us-east-1" }.use { snsClient ->
snsClient.setTopicAttributes(request)
println("Topic ${request.topicArn} was updated.")
}
}
- PHP
-
- 適用於 PHP 的開發套件
-
require 'vendor/autoload.php';
use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;
/**
* Configure the message delivery status attributes for an Amazon SNS Topic.
*
* This code expects that you have AWS credentials set up per:
* https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html
*/
$SnSclient = new SnsClient([
'profile' => 'default',
'region' => 'us-east-1',
'version' => '2010-03-31'
]);
$attribute = 'Policy | DisplayName | DeliveryPolicy';
$value = 'First Topic';
$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';
try {
$result = $SnSclient->setTopicAttributes([
'AttributeName' => $attribute,
'AttributeValue' => $value,
'TopicArn' => $topic,
]);
var_dump($result);
} catch (AwsException $e) {
// output error message if fails
error_log($e->getMessage());
}
- Ruby
-
- 適用於 Ruby 的開發套件
-
# Service class to enable an SNS resource with a specified policy
class SnsResourceEnabler
# Initializes the SnsResourceEnabler with an SNS resource client
#
# @param sns_resource [Aws::SNS::Resource] The SNS resource client
def initialize(sns_resource)
@sns_resource = sns_resource
@logger = Logger.new($stdout)
end
# Sets a policy on a specified SNS topic
#
# @param topic_arn [String] The ARN of the SNS topic
# @param resource_arn [String] The ARN of the resource to include in the policy
# @param policy_name [String] The name of the policy attribute to set
def enable_resource(topic_arn, resource_arn, policy_name)
policy = generate_policy(topic_arn, resource_arn)
topic = @sns_resource.topic(topic_arn)
topic.set_attributes({
attribute_name: policy_name,
attribute_value: policy
})
@logger.info("Policy #{policy_name} set successfully for topic #{topic_arn}.")
rescue Aws::SNS::Errors::ServiceError => e
@logger.error("Failed to set policy: #{e.message}")
end
private
# Generates a policy string with dynamic resource ARNs
#
# @param topic_arn [String] The ARN of the SNS topic
# @param resource_arn [String] The ARN of the resource
# @return [String] The policy as a JSON string
def generate_policy(topic_arn, resource_arn)
{
Version: "2008-10-17",
Id: "__default_policy_ID",
Statement: [{
Sid: "__default_statement_ID",
Effect: "Allow",
Principal: { "AWS": "*" },
Action: ["SNS:Publish"],
Resource: topic_arn,
Condition: {
ArnEquals: {
"AWS:SourceArn": resource_arn
}
}
}]
}.to_json
end
end
# Example usage:
if $PROGRAM_NAME == __FILE__
topic_arn = "MY_TOPIC_ARN" # Should be replaced with a real topic ARN
resource_arn = "MY_RESOURCE_ARN" # Should be replaced with a real resource ARN
policy_name = "POLICY_NAME" # Typically, this is "Policy"
sns_resource = Aws::SNS::Resource.new
enabler = SnsResourceEnabler.new(sns_resource)
enabler.enable_resource(topic_arn, resource_arn, policy_name)
end
- SAP ABAP
-
- 適用於 SAP ABAP 的開發套件
-
TRY.
lo_sns->settopicattributes(
iv_topicarn = iv_topic_arn
iv_attributename = iv_attribute_name
iv_attributevalue = iv_attribute_value
).
MESSAGE 'Set/updated SNS topic attributes.' TYPE 'I'.
CATCH /aws1/cx_snsnotfoundexception.
MESSAGE 'Topic does not exist.' TYPE 'E'.
ENDTRY.
若要DeliveryStatusLogging
使用進行設定 AWS CloudFormation,請使用 JSON 或 YAML 範本建立 AWS CloudFormation 堆疊。若要取得更多資訊,請參閱《 AWS CloudFormation 使用指南》中的AWS::SNS::Topic
資源DeliveryStatusLogging
屬性。以下是 JSON 和 YAML 中的 AWS CloudFormation 範本範例,可用來建立新主題或使用 Amazon SQS 通訊協定的所有DeliveryStatusLogging
屬性更新現有主題。
- JSON
-
"Resources": {
"MySNSTopic" : {
"Type" : "AWS::SNS::Topic",
"Properties" : {
"TopicName" : "TestTopic",
"DisplayName" : "TEST",
"SignatureVersion" : "2",
"DeliveryStatusLogging" : [{
"Protocol": "sqs",
"SuccessFeedbackSampleRate": "45",
"SuccessFeedbackRoleArn": "arn:aws:iam::123456789012:role/SNSSuccessFeedback_test1",
"FailureFeedbackRoleArn": "arn:aws:iam::123456789012:role/SNSFailureFeedback_test2"
}]
}
}
}
- YAML
-
Resources:
MySNSTopic:
Type: AWS::SNS::Topic
Properties:
TopicName:TestTopic
DisplayName:TEST
SignatureVersion:2
DeliveryStatusLogging:
- Protocol: sqs
SuccessFeedbackSampleRate: 45
SuccessFeedbackRoleArn: arn:aws:iam::123456789012:role/SNSSuccessFeedback_test1
FailureFeedbackRoleArn: arn:aws:iam::123456789012:role/SNSFailureFeedback_test2