1

以下代码允许我SNS使用(队列)发送,SQS但我似乎无法选择亚马逊管理控制台中的协议 在此处输入图像描述


* 键都是随机字符串

<?php
require_once('sdk-1.5.6.2/sdk.class.php');  
$AWS_KEY = "6VVWTU4JDAAKHYB1C3ZN";
$AWS_SECRET_KEY = "GMSCUD8C0QA1QLV9Y3RP2IAKDIZSCHRGKEJSXZ4F";

//create a new SQS queue and grab the queue URL
$sqs = new AmazonSQS(array( "key" => $AWS_KEY, "secret" => $AWS_SECRET_KEY ));
$response = $sqs->create_queue('test-topic-queue');
$queue_url = (string) $response->body->CreateQueueResult->QueueUrl;
$queue_arn = 'arn:aws:sqs:us-east-1:ENCQ8gqrAcXv:test-topic-queue';

//create a new SNS topic and grab the topic ARN.
$sns = new AmazonSNS(array( "key" => $AWS_KEY, "secret" => $AWS_SECRET_KEY ));
$response = $sns->create_topic('test-topic');
$topic_arn = (string) $response->body->CreateTopicResult->TopicArn;

//Then give the SNS topic the permission to send messages to the SQS queue. ** allow all principals. SNS doesn't send from your account ID -- it has its own account ID that it sends from.
$queue_url = 'https://sqs.us-east-1.amazonaws.com/ENCQ8gqrAcXv/test-topic-queue';
$queue_arn = 'arn:aws:sqs:us-east-1:ENCQ8gqrAcXv:test-topic-queue';
$topic_arn = 'arn:aws:sns:us-east-1:ENCQ8gqrAcXv:test-topic';

$policy = new CFPolicy($sqs, array(
        'Version' => '2008-10-17',
        'Id' => 'sampleId',
        'Statement' => array(
                array(
                        'Resource' => $queue_arn,
                        'Effect' => 'Allow',
                        'Sid' => 'rule1',
                        'Action' => 'sqs:*',
                        'Condition' => array(
                                'StringEquals' => array(
                                        'aws:SourceArn' => $topic_arn
                                )
                        ),
                        'Principal' => array(
                                'AWS' => '*'
                        )
                )
        )
));

$response = $sqs->set_queue_attributes($queue_url, array(
        array('Name' => 'Policy', 'Value' => $policy->get_json())
));


//then subscribe the SQS queue to the SNS topic and grab the subscription ARN.
$queue_arn = 'arn:aws:sqs:us-east-1:ENCQ8gqrAcXv:test-topic-queue';
$topic_arn = 'arn:aws:sns:us-east-1:ENCQ8gqrAcXv:test-topic';
$response = $sns->subscribe($topic_arn, 'sqs', $queue_arn);




// normally here is where you would choose the protocol but this example sends this to SQS
// subscribe ( $topic_arn, $protocol, $endpoint, $opt ) 




$subscription_arn = (string) $response->body->SubscribeResult->SubscriptionArn;
//view the list of subscriptions to verify.
$topic_arn = 'arn:aws:sns:us-east-1:ENCQ8gqrAcXv:test-topic';

$q = new CFBatchRequest(200);
for ($i = 0; $i < 1000; $i++)
{
        $sns->batch($q)->publish($topic_arn, 'Hello world! ' . time());
}
$response = $sns->batch($q)->send();


//receive messages from the queue.
$queue_url = 'https://sqs.us-east-1.amazonaws.com/ENCQ8gqrAcXv/test-topic-queue';
$response = $sqs->receive_message($queue_url, array(
        'MaxNumberOfMessages' => 10,
));
print_r($response); 


// delete SQS queue
$queue_url = 'https://sqs.us-east-1.amazonaws.com/ENCQ8gqrAcXv/test-topic-queue'; 
$response = $sqs->delete_queue($queue_url);

?>



问题:我会在哪里选择协议?
此链接说这subscribe()protocol定义的位置,但上面的示例将其发送到SQS

4

2 回答 2

3

您可以使用 SNS 推送到短信号码,也可以使用 SNS 推送到 SQS 队列。但 SQS 无法推送任何内容——包括推送到 SMS 号码。

也许您对基础架构组件感到困惑?

于 2012-10-05T08:48:32.723 回答
2

订阅方法具有以下签名

subscribe ( $topic_arn, $protocol, $endpoint, $opt )

如果您要使用 SMS 作为协议进行订阅,请执行以下操作

$response = $sns->subscribe($topic_arn, 'sms', $phone_no);

$phone_no(String)启用短信的设备的电话号码在哪里

当前支持的不同协议是 http、https、email、email-json、sms 和 sqs,具体取决于您必须更改$endpoint传递给 subscribe 方法的参数的协议。

查看订阅方法的完整文档

于 2012-06-26T04:09:11.237 回答