Reputation: 4693
The following code allows me to send SNS
with (queue) SQS
but i cant seem to choose the protocol like in amazons management console
* the keys are all random strings
<?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);
?>
question: where would i choose the protocol?
this link says that subscribe()
is where protocol
is defined but the above example sends that to SQS
Upvotes: 1
Views: 2746
Reputation: 6936
You can use SNS to push to an SMS number, and you can also use SNS to push to an SQS queue. But SQS is not capable of pushing anything — including to an SMS number.
Perhaps you have your infrastructure components confused?
Upvotes: 3
Reputation: 12504
Subscribe method has the following signature
subscribe ( $topic_arn, $protocol, $endpoint, $opt )
If you what to subscribe using SMS as protocol then do the following
$response = $sns->subscribe($topic_arn, 'sms', $phone_no);
where $phone_no(String)
is the phone number of the sms enabled device
The different protocols currently supported are http, https, email, email-json, sms and sqs based on the protocol you have to change the $endpoint
parameter passed to the subscribe method.
Checkout the full documentation for subscribe method
Upvotes: 2