Skip to content

Instantly share code, notes, and snippets.

@akiatoji
Last active January 15, 2020 02:30
Show Gist options
  • Save akiatoji/4489390 to your computer and use it in GitHub Desktop.
Save akiatoji/4489390 to your computer and use it in GitHub Desktop.
AWS SNS Sample code.
Notes on how to use AWS SNS:
1. Subscribe an HTTP endpoint (i.e. http://myhost/sns_endpoint) on AWS Console
2. AWS will send subscription confirmation right away
3. SNS_controller responds to subscription confirmation by sending confirmation using Fog.
4. Once AWS is happy, you can start sending notifications to your end point via SNS.
class SNSConfirmation
def self.confirm(arn, token)
Rails.logger.debug "#{Figaro.env.aws_access_key} wheee"
sns = Fog::AWS::SNS.new(
aws_access_key_id: Figaro.env.aws_access_key,
aws_secret_access_key: Figaro.env.aws_secret_access_key
)
sns.confirm_subscription(arn, token)
end
end
class SnsController < ApplicationController
def sns_endpoint
notification = Hashie::Mash.new JSON.parse(request.raw_post)
case notification.Type
when "SubscriptionConfirmation"
SNSConfirmation.confirm(notification.TopicArn, notification.Token)
when "Notification"
SNSNotificationModel.create(:msg notification.Message)
else
Rails.logger.error "Unknown notification type #{notification.Type}"
end
render nothing: true
end
end
require 'spec_helper'
describe SnsController do
describe "confirmation" do
let(:confirmation_raw_json) { '{
"Type" : "SubscriptionConfirmation",
"MessageId" : "33444d09-1ca3-442f-a736-c1848ccbfcd9",
"TopicArn" : "arn:aws:sns:us-east-1:123456789012:MyTopic",
"Token" : "2336412f37fb687f5d51e6e241d164b14f9e81c6c9aa29262ce3fb4117fb80948fc247162d9d2b1b74c51218008d9b17aa760450f775d3dc0a5bede65011342fd6b520e5404d4e01cc29f5ba5dcc07e91498edde82b7401f7a62cc272416eed80929ae7d3c5395ceb6730fa5a41d0029d0bae9128822d25c7b6ab5b5739c9f61",
"SubscribeURL" : "https://sns.us-east-1.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-1:123456789012:MyTopic&Token=2336412f37fb687f5d51e6e241d09c805a5a57b30d712f794cc5f6a988666d92768dd60a747ba6f3beb71854e285d6ad02428b09ceece29417f1f02d609c582afbacc99c583a916b9981dd2728f4ae6fdb82efd087cc3b7849e05798d2d2785c03b0879594eeac82c01f235d0e717736"}'
}
it "dispatches subscription confirmation" do
h = JSON.parse(confirmation_raw_json)
SNSConfirmation.should_receive(:confirm).with(h['TopicArn'], h['Token'])
@request.env['RAW_POST_DATA'] = confirmation_raw_json
post :sns_endpoint, {}
end
end
describe "notification" do
let(:notification_raw_json) {
'{"Type" : "Notification",
"Message" : "{ \"uuid\": \"12341234uu\", \"status\": \"Processing\" }" }'
}
it "dispatches notification" do
h = JSON.parse(notification_raw_json)
pst = mock_model(ProcessStatus)
@request.env['RAW_POST_DATA'] = notification_raw_json
ProcessStatus.should_receive(:where).with( uuid: "12341234uu" ).and_return(pst)
pst.should_receive(:status=)
pst.should_receive(:save!)
post :sns_endpoint, {}
end
end
end
@cavpollo
Copy link

Thank you, this was extremely helpful!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment