Skip to content

Commit 9d90b0e

Browse files
committed
Support cross-region SNS topic subscription
1 parent fdb96e2 commit 9d90b0e

File tree

7 files changed

+19
-13
lines changed

7 files changed

+19
-13
lines changed

app/controllers/barbeque/sns_subscriptions_controller.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ def destroy
4444
private
4545

4646
def fetch_sns_topic_arns
47-
Barbeque::SNSSubscriptionService.sns_client.list_topics.topics.map(&:topic_arn)
47+
if Barbeque.config.sns_regions.empty?
48+
Aws::SNS::Client.new.list_topics.topics.map(&:topic_arn)
49+
else
50+
Barbeque.config.sns_regions.flat_map do |region|
51+
Aws::SNS::Client.new(region: region).list_topics.topics.map(&:topic_arn)
52+
end
53+
end
4854
end
4955
end

app/models/barbeque/sns_subscription.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,9 @@ class SNSSubscription < ApplicationRecord
77
validates :topic_arn,
88
uniqueness: { scope: :job_queue, message: 'should be set with only one queue' },
99
presence: true
10+
11+
def region
12+
/\Aarn:aws:sns:([a-z0-9-]+):/.match(topic_arn)[1]
13+
end
1014
end
1115
end

app/services/barbeque/sns_subscription_service.rb

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ def self.sqs_client
66
@sqs_client ||= Aws::SQS::Client.new
77
end
88

9-
def self.sns_client
10-
@sns_client ||= Aws::SNS::Client.new
11-
end
12-
139
# @param [Barbeque::SNSSubscription] sns_subscription
1410
# @return [Boolean] `true` if succeeded to subscribe
1511
def subscribe(sns_subscription)
@@ -45,10 +41,6 @@ def sqs_client
4541
Barbeque::SNSSubscriptionService.sqs_client
4642
end
4743

48-
def sns_client
49-
Barbeque::SNSSubscriptionService.sns_client
50-
end
51-
5244
# @param [Barbeque::SNSSubscription] sns_subscription
5345
def update_sqs_policy!(sns_subscription)
5446
attrs = sqs_client.get_queue_attributes(
@@ -98,6 +90,7 @@ def subscribe_topic!(sns_subscription)
9890
)
9991
queue_arn = sqs_attrs.attributes['QueueArn']
10092

93+
sns_client = Aws::SNS::Client.new(region: sns_subscription.region)
10194
sns_client.subscribe(
10295
topic_arn: sns_subscription.topic_arn,
10396
protocol: 'sqs',
@@ -113,6 +106,8 @@ def unsubscribe_topic!(sns_subscription)
113106
)
114107
queue_arn = sqs_attrs.attributes['QueueArn']
115108

109+
sns_client = Aws::SNS::Client.new(region: sns_subscription.region)
110+
116111
subscriptions = sns_client.list_subscriptions_by_topic(
117112
topic_arn: sns_subscription.topic_arn,
118113
)

lib/barbeque/config.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
module Barbeque
55
class Config
6-
attr_accessor :exception_handler, :executor, :executor_options, :sqs_receive_message_wait_time, :maximum_concurrent_executions, :runner_wait_seconds
6+
attr_accessor :exception_handler, :executor, :executor_options, :sqs_receive_message_wait_time, :maximum_concurrent_executions, :runner_wait_seconds, :sns_regions
77

88
def initialize(options = {})
99
options.each do |key, value|
@@ -27,6 +27,7 @@ module ConfigBuilder
2727
# nil means unlimited
2828
'maximum_concurrent_executions' => nil,
2929
'runner_wait_seconds' => 10,
30+
'sns_regions' => [],
3031
}
3132

3233
def config

spec/controllers/barbeque/job_definitions_controller_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@
191191
let(:subscription_arn) { 'arn:aws:sns:ap-northeast-1:012345678912:barbeque-spec:01234567-89ab-cdef-0123-456789abcdef' }
192192

193193
before do
194-
allow(Barbeque::SNSSubscriptionService).to receive(:sns_client).and_return(sns_client)
195194
allow(Barbeque::SNSSubscriptionService).to receive(:sqs_client).and_return(sqs_client)
195+
allow(Aws::SNS::Client).to receive(:new).with(region: 'ap-northeast-1').and_return(sns_client)
196196

197197
allow(sqs_client).to receive(:get_queue_attributes).
198198
with(queue_url: sns_subscription.job_queue.queue_url, attribute_names: ['QueueArn']).

spec/controllers/barbeque/sns_subscriptions_controller_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
before do
77
allow(Barbeque::SNSSubscriptionService).to receive(:sqs_client).and_return(sqs_client)
8-
allow(Barbeque::SNSSubscriptionService).to receive(:sns_client).and_return(sns_client)
8+
allow(Aws::SNS::Client).to receive(:new).with(region: 'ap-northeast-1').and_return(sns_client)
99
end
1010

1111
describe '#create' do

spec/factories/sns_subscription.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
FactoryBot.define do
22
factory :sns_subscription, class: Barbeque::SNSSubscription do
3-
sequence(:topic_arn) { |n| "arn:aws:sns:ap-northest-1:123456789012/Topic-#{n}" }
3+
sequence(:topic_arn) { |n| "arn:aws:sns:ap-northeast-1:123456789012/Topic-#{n}" }
44
job_queue
55
job_definition
66
end

0 commit comments

Comments
 (0)