我想创建 AWS SQS,然后将其订阅到现有的 SNS 主题。要使用这种方法,根据 Camel 文档,我必须知道队列 URL。
//create SQS
from("aws-sqs://MyQueue?amazonSQSClient=#client&delay=5000&maxMessagesPerPoll=5")
.startupOrder(1)
.to("mock:result");
//create SNS and subscribe to SQS
from("direct:start")
.startupOrder(2)
.to("aws-sns://test-camel-sns1?amazonSNSClient=#amazonSNSClient&amazonSQSClient=#amazonSQSClient&subscribeSNStoSQS=true&queueUrl=https://sqs.eu-central-1.amazonaws.com/780410022472/MyQueue");
但是我想使用以前创建的SQS(我知道SQS的名称),但我不知道帐户价值(780410022472)。 如何通过 Camel 创建 SQS 并订阅 SNS,而无需额外信息(例如账户价值)?
如果您可以通过 CLI 访问 AWS 账户,则可以简单地列出所有现有队列,如下所示:
aws sqs list-queues
这将返回 SQS 队列 URL,如下所示:
https://queue.amazonaws.com/80398EXAMPLE/MyQueue
在上面的示例中,帐号为
80398EXAMPLE
。
您还可以使用以下命令获取当前 IAM 用户/角色的账户详细信息:
aws sts get-caller-identity
这将返回带有
Account
字段的帐号。
我还没有在AWS上尝试过这个解决方案,但我在LocalStack上测试了它,它似乎工作正常:
class LocalStack extends org.apache.camel.builder.RouteBuilder {
@Override
public void configure() throws Exception {
AwsBasicCredentials credentials = AwsBasicCredentials.create("dummy", "dummy");
bindToRegistry("amazonSQSClient",
SqsClient.builder()
.endpointOverride(new URI("http://localhost:4566"))
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.build());
bindToRegistry("amazonSNSClient",
SnsClient.builder()
.endpointOverride(new URI("http://localhost:4566"))
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.build());
from("aws2-sqs://MyQueue?amazonSQSClient=#amazonSQSClient&autoCreateQueue=true").to("mock:result");
Endpoint endpoint = camelContext.getEndpoint("aws2-sqs://MyQueue?amazonSQSClient=#amazonSQSClient&autoCreateQueue=true");
Assert.assertTrue(endpoint instanceof Sqs2Endpoint);
SqsClient sqsClient = ((Sqs2Endpoint) endpoint).getClient();
String url = sqsClient.getQueueUrl(builder -> builder.queueName("MyQueue")).queueUrl();
from("direct:start")
.to("aws2-sns://active_inventory-int-public-outgoing-notifications" +
"?autoCreateTopic=true" +
"&amazonSNSClient=#amazonSNSClient" +
"&subscribeSNStoSQS=true" +
"&queueUrl=" + url);
}
代码应该是不言自明的。需要调用
bindToRegistry
只是因为我正在 LocalStack 上工作,否则默认值应该没问题。