-
-
Save kylefritz/633175 to your computer and use it in GitHub Desktop.
require 'openssl' | |
require "hmac-sha2" | |
require "cgi" | |
require 'time' | |
require 'net/https' | |
require 'base64' | |
$AWS_ID='<set aws id>' | |
$AWS_KEY='<set aws key>' | |
$SNS_ENDPOINT='sns.us-east-1.amazonaws.com' | |
def url_encode(string) | |
# don't encode: ~_-, spaces must me %20 | |
CGI.escape(string.to_s).gsub("%7E", "~").gsub("+", "%20") | |
end | |
def canonical_query_string(params) | |
#sort params by byte order | |
params.keys.sort.collect {|key| [url_encode(key), url_encode(params[key])].join("=") }.join("&") | |
end | |
def sign_request(params) | |
hmac = HMAC::SHA256.new($AWS_KEY) | |
hmac.update ['GET',$SNS_ENDPOINT,'/',canonical_query_string(params)].join("\n") | |
signature = Base64.encode64(hmac.digest).chomp | |
end | |
def publish(arn, subject, msg) | |
params = { | |
'Subject' => subject, | |
'TopicArn' => arn, | |
'Message' => msg, | |
'Action' => 'Publish', | |
'SignatureMethod' => 'HmacSHA256', | |
'SignatureVersion' => 2, | |
'Timestamp' => Time.now.utc.iso8601, | |
'AWSAccessKeyId' => $AWS_ID | |
} | |
params['Signature']=sign_request(params) | |
query_string = canonical_query_string(params) | |
response=Net::HTTP.get_response(URI.parse("http://#{$SNS_ENDPOINT}/?#{query_string}")) | |
raise "SNS Publish failed #{response.code}\n#{response.body}" unless response.code=="200" | |
end |
from time import strftime,gmtime,time | |
import urllib2 | |
import hmac | |
import hashlib | |
import base64 | |
import string | |
def publishAmazonSnsMsg(Subject,TopicArn,Message,AWSAccessKeyId,privatekey): | |
#http://docs.amazonwebservices.com/AWSSimpleQueueService/2008-01-01/SQSDeveloperGuide/ | |
amzsnshost = 'sns.us-east-1.amazonaws.com' | |
params = {'Subject' : Subject, | |
'TopicArn' : TopicArn, | |
'Message' :Message, | |
'Timestamp' : strftime("%Y-%m-%dT%H:%M:%S.000Z", gmtime(time())), | |
'AWSAccessKeyId' : AWSAccessKeyId, | |
'Action' : 'Publish', | |
'SignatureVersion' : '2', | |
'SignatureMethod' : 'HmacSHA256', | |
} | |
cannqs=string.join(["%s=%s"%(urllib2.quote(key),urllib2.quote(params[key], safe='-_~')) \ | |
for key in sorted(params.keys())],'&') | |
string_to_sign=string.join(["GET",amzsnshost,"/",cannqs],'\n') | |
sig=base64.b64encode(hmac.new(privatekey,string_to_sign,digestmod=hashlib.sha256).digest()) | |
url="http://%s/?%s&Signature=%s"%(amzsnshost,cannqs,urllib2.quote(sig)) | |
try: | |
return urllib2.urlopen(url).read() | |
except urllib2.HTTPError, exception: | |
return "Error %s (%s):\n%s"%(exception.code,exception.msg,exception.read()) |
Any way to get this in PHP?
I've been trying to establish a button on a website that would, onClick() send a static alert to my phone via AWS SNS service. I'm not really having much luck though.
Thanks, this was so useful, I had a horrible time with the documentation and C++
What if I wanted to send an sms message to a mobile device, so a phone number, via AWS SNS? I'm having hard time figuring out the connection.
IxayWolf, I was able to get that working by changing the params like such and providing the PhoneNumber in E.164 format (+[countrycode][phonenumber]), example +18005551212:
params = {'PhoneNumber' : Phone,
'Message' :Message,
'Timestamp' : strftime("%Y-%m-%dT%H:%M:%S.000Z", gmtime(time())),
'AWSAccessKeyId' : AWSAccessKeyId,
'Action' : 'Publish',
'SignatureVersion' : '2',
'SignatureMethod' : 'HmacSHA256',
}
Enjoy!
As @kylefritz mentioned, better to use boto SNS client for this...
If you see 'dict' object has no attribute 'rstrip’
, replace line 21 in publishAmazonSnsMsg.py
with:
cannqs=string.join(["%s=%s"%(urllib2.quote(key),urllib2.quote(str(params[key]), safe='-_~')) for key in sorted(params.keys())],'&')
(convert params[key]
to string)
As mentioned by others, boto3 is a nicer way of doing this. Here’s the code for that
import boto3
def publish(topic_arn, message_json, region):
client = boto3.client('sns', region_name = region)
return client.publish(TopicArn=topic_arn, Message=message_json)
Your AWS_ACCESS_KEY_ID
and AWS_SECRET_ACCESS_KEY
can be environment variables
Also there's a very complete python AWS library called boto.