如何在Java应用程序中使用Amazon Web服务策略语句?
我想从后端Java应用程序向AmazonSQS队列发送AmazonSNS消息。根据《SNS开发者指南》(),在“将亚马逊SNS消息发送到亚马逊SQS队列”一节中的主题-“步骤2.允许亚马逊SNS主题将消息发送到亚马逊SQS队列”,其内容如下: 如果您想自己创建策略文档,您可以创建 像下面这样的政策。该策略允许MyTopic发送 发送到MyQueue的消息 我的疑问是如何在java应用程序中使用这个策略文档(.json文件,如果我没有错的话),以及在哪里使用它?因为我必须在队列上设置一个允许Amazon SNS主题执行sqs:SendMessage操作的策略。如何在Java应用程序中使用Amazon Web服务策略语句?,java,amazon-web-services,amazon-sqs,amazon-sns,spring-cloud,Java,Amazon Web Services,Amazon Sqs,Amazon Sns,Spring Cloud,我想从后端Java应用程序向AmazonSQS队列发送AmazonSNS消息。根据《SNS开发者指南》(),在“将亚马逊SNS消息发送到亚马逊SQS队列”一节中的主题-“步骤2.允许亚马逊SNS主题将消息发送到亚马逊SQS队列”,其内容如下: 如果您想自己创建策略文档,您可以创建 像下面这样的政策。该策略允许MyTopic发送 发送到MyQueue的消息 我的疑问是如何在java应用程序中使用这个策略文档(.json文件,如果我没有错的话),以及在哪里使用它?因为我必须在队列上设置一个允许Ama
TIA。您不必在Java应用程序中这样做 转到AWS控制台,选择,选择一个用户(或创建一个),然后在“权限”下附加策略 这就是它的样子:
策略(JSON文档)可以从列表中选择、使用向导生成或手动输入(这是您想要的)。您不必在Java应用程序中执行此操作 转到AWS控制台,选择,选择一个用户(或创建一个),然后在“权限”下附加策略 这就是它的样子:
策略(JSON文档)可以从列表中选择、使用向导生成或手动输入(这是您想要的)。下面是一个Java示例,用于创建SNS主题和SQS队列、将SQS队列订阅到SNS主题、授予SNS向队列发送消息的权限、向SNS发送消息、,然后从队列中读取
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.auth.policy.Condition;
import com.amazonaws.auth.policy.Policy;
import com.amazonaws.auth.policy.Principal;
import com.amazonaws.auth.policy.Resource;
import com.amazonaws.auth.policy.Statement;
import com.amazonaws.auth.policy.actions.SQSActions;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClient;
import com.amazonaws.services.sqs.model.CreateQueueRequest;
import com.amazonaws.services.sqs.model.Message;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import com.amazonaws.services.sqs.model.ReceiveMessageResult;
import com.amazonaws.services.sqs.model.SetQueueAttributesRequest;
import java.util.Arrays;
import java.util.Optional;
public class CreateSnsAndSqs {
private static final String SNS_TOPIC = "my-sns-topic";
private static final String SQS_NAME = "my-sqs-queue";
public static void main(String... argv) {
String regionName = Optional.ofNullable(System.getenv("AWS_DEFAULT_REGION")).orElse("us-east-1");
Region region = RegionUtils.getRegion(regionName);
ClientConfiguration clientConfiguration = new ClientConfiguration();
// AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
DefaultAWSCredentialsProviderChain credentialsChain = new DefaultAWSCredentialsProviderChain();
AmazonSNS sns = region.createClient(AmazonSNSClient.class, credentialsChain, clientConfiguration);
AmazonSQS sqs = region.createClient(AmazonSQSClient.class, credentialsChain, clientConfiguration);
String sqsUrl = sqs.createQueue(new CreateQueueRequest(SQS_NAME)).getQueueUrl();
String snsTopicArn = sns.createTopic(SNS_TOPIC).getTopicArn();
String sqsArn = sqs.getQueueAttributes(sqsUrl, Arrays.asList("QueueArn")).getAttributes().get("QueueArn");
String sqsSubscriptionArn = sns.subscribe(snsTopicArn, "sqs", sqsArn).getSubscriptionArn();
Policy allowSnsToPostToSqsPolicy = new Policy("allow sns " + snsTopicArn + " to send to queue", Arrays.asList(
new Statement(Statement.Effect.Allow)
.withPrincipals(Principal.All)
.withActions(SQSActions.SendMessage)
.withResources(new Resource(sqsArn))
.withConditions(new Condition().withType("ArnEquals").withConditionKey("aws:SourceArn").withValues(snsTopicArn))
));
sqs.setQueueAttributes(new SetQueueAttributesRequest().withQueueUrl(sqsUrl).addAttributesEntry("Policy", allowSnsToPostToSqsPolicy.toJson()));
String sqsSubscriptionArn = sns.subscribe(snsTopicArn, "sqs", sqsArn).getSubscriptionArn();
sns.publish(snsTopicArn, "Hello world");
ReceiveMessageResult receiveResp = sqs.receiveMessage(new ReceiveMessageRequest(sqsUrl).withWaitTimeSeconds(10));
for (Message message: receiveResp.getMessages()) {
System.out.println("Received message " + message.getBody());
sqs.deleteMessage(sqsUrl, message.getReceiptHandle());
}
System.out.println("Deleting");
sns.deleteTopic(snsTopicArn);
sqs.deleteQueue(sqsUrl);
}
}
它将消息打印到控制台,如下所示:
Received message {
"Type" : "Notification",
"MessageId" : "add8d56a-19e6-5806-9424-9a2a796f8f94",
"TopicArn" : "arn:aws:sns:us-east-1:111111111111:my-sns-topic",
"Message" : "Hello world",
"Timestamp" : "2016-02-19T00:14:01.973Z",
"SignatureVersion" : "1",
"Signature" : "XXXaLONGSIGNATUREXXX",
"SigningCertURL" : "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-bb750dd426d95ee9390147a5624348ee.pem",
"UnsubscribeURL" : "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:111111111111:my-sns-topic:5e4d08a2-bcdb-4943-afef-5b7b02e30d5a"
}
Deleting
下面是一个Java示例,用于创建SNS主题和SQS队列、将SQS队列订阅到SNS主题、授予SNS向队列发送消息的权限、向SNS发送消息以及从队列中读取消息
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.auth.policy.Condition;
import com.amazonaws.auth.policy.Policy;
import com.amazonaws.auth.policy.Principal;
import com.amazonaws.auth.policy.Resource;
import com.amazonaws.auth.policy.Statement;
import com.amazonaws.auth.policy.actions.SQSActions;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClient;
import com.amazonaws.services.sqs.model.CreateQueueRequest;
import com.amazonaws.services.sqs.model.Message;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import com.amazonaws.services.sqs.model.ReceiveMessageResult;
import com.amazonaws.services.sqs.model.SetQueueAttributesRequest;
import java.util.Arrays;
import java.util.Optional;
public class CreateSnsAndSqs {
private static final String SNS_TOPIC = "my-sns-topic";
private static final String SQS_NAME = "my-sqs-queue";
public static void main(String... argv) {
String regionName = Optional.ofNullable(System.getenv("AWS_DEFAULT_REGION")).orElse("us-east-1");
Region region = RegionUtils.getRegion(regionName);
ClientConfiguration clientConfiguration = new ClientConfiguration();
// AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
DefaultAWSCredentialsProviderChain credentialsChain = new DefaultAWSCredentialsProviderChain();
AmazonSNS sns = region.createClient(AmazonSNSClient.class, credentialsChain, clientConfiguration);
AmazonSQS sqs = region.createClient(AmazonSQSClient.class, credentialsChain, clientConfiguration);
String sqsUrl = sqs.createQueue(new CreateQueueRequest(SQS_NAME)).getQueueUrl();
String snsTopicArn = sns.createTopic(SNS_TOPIC).getTopicArn();
String sqsArn = sqs.getQueueAttributes(sqsUrl, Arrays.asList("QueueArn")).getAttributes().get("QueueArn");
String sqsSubscriptionArn = sns.subscribe(snsTopicArn, "sqs", sqsArn).getSubscriptionArn();
Policy allowSnsToPostToSqsPolicy = new Policy("allow sns " + snsTopicArn + " to send to queue", Arrays.asList(
new Statement(Statement.Effect.Allow)
.withPrincipals(Principal.All)
.withActions(SQSActions.SendMessage)
.withResources(new Resource(sqsArn))
.withConditions(new Condition().withType("ArnEquals").withConditionKey("aws:SourceArn").withValues(snsTopicArn))
));
sqs.setQueueAttributes(new SetQueueAttributesRequest().withQueueUrl(sqsUrl).addAttributesEntry("Policy", allowSnsToPostToSqsPolicy.toJson()));
String sqsSubscriptionArn = sns.subscribe(snsTopicArn, "sqs", sqsArn).getSubscriptionArn();
sns.publish(snsTopicArn, "Hello world");
ReceiveMessageResult receiveResp = sqs.receiveMessage(new ReceiveMessageRequest(sqsUrl).withWaitTimeSeconds(10));
for (Message message: receiveResp.getMessages()) {
System.out.println("Received message " + message.getBody());
sqs.deleteMessage(sqsUrl, message.getReceiptHandle());
}
System.out.println("Deleting");
sns.deleteTopic(snsTopicArn);
sqs.deleteQueue(sqsUrl);
}
}
它将消息打印到控制台,如下所示:
Received message {
"Type" : "Notification",
"MessageId" : "add8d56a-19e6-5806-9424-9a2a796f8f94",
"TopicArn" : "arn:aws:sns:us-east-1:111111111111:my-sns-topic",
"Message" : "Hello world",
"Timestamp" : "2016-02-19T00:14:01.973Z",
"SignatureVersion" : "1",
"Signature" : "XXXaLONGSIGNATUREXXX",
"SigningCertURL" : "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-bb750dd426d95ee9390147a5624348ee.pem",
"UnsubscribeURL" : "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:111111111111:my-sns-topic:5e4d08a2-bcdb-4943-afef-5b7b02e30d5a"
}
Deleting
非常感谢你。我会遵守的+请原谅我在这里再问你一个问题。我按照SNS指南中的说明“将Amazon SNS消息发送到Amazon SQS队列”。此外,我还分别为SQS和SNS创建了crud。最后,为了向Android应用程序发送notifn,我使用了“SNSMobilePush.java”。现在,如果我在java应用程序中运行这个文件,push Notifn就可以工作了。现在如何将这些片段组合在一起?“JavaBackendApp->SNS->SQS->Android应用程序”。请引导我。@Chandz:那么你需要你的JavaBackendApp做和SNSMobilePush.java一样的事情吗?为什么不将
demandoridappnotification
(和其他函数)的源代码复制到您的JavaBackendApp?是的,您是对的。我的JavaBackEndApp将使用SNSMobilePush.java。当我运行这个文件时,它使用demoAndroidAppNotification向Android手机发送通知。另一方面,我使用SNS指南配置了“将Amazon SNS消息发送到Amazon SQS队列”。现在我要把这两部分结合起来。i、 例如,demoAndroidAppNotification()应该向SQS发送notifn消息,然后SQS应该向Android应用程序发送notifn消息(而不是从demoAndroidAppNotification直接向Android手机发送notifn)。我怎样才能做到呢?很抱歉,我没有使用这些服务或移动通知的经验。但是通过阅读一些文档,我认为没有理由在Android推送通知中使用SQS——SNS只是直接发送,不需要使用SQS排队。SQS是队列,它本身不主动发送任何内容。还是要在应用程序中轮询通知?非常感谢。我会遵守的+请原谅我在这里再问你一个问题。我按照SNS指南中的说明“将Amazon SNS消息发送到Amazon SQS队列”。此外,我还分别为SQS和SNS创建了crud。最后,为了向Android应用程序发送notifn,我使用了“SNSMobilePush.java”。现在,如果我在java应用程序中运行这个文件,push Notifn就可以工作了。现在如何将这些片段组合在一起?“JavaBackendApp->SNS->SQS->Android应用程序”。请引导我。@Chandz:那么你需要你的JavaBackendApp做和SNSMobilePush.java一样的事情吗?为什么不将demandoridappnotification
(和其他函数)的源代码复制到您的JavaBackendApp?是的,您是对的。我的JavaBackEndApp将使用SNSMobilePush.java。当我运行这个文件时,它使用demoAndroidAppNotification向Android手机发送通知。另一方面,我使用SNS指南配置了“将Amazon SNS消息发送到Amazon SQS队列”。现在我要把这两部分结合起来。i、 例如,demoAndroidAppNotification()应该向SQS发送notifn消息,然后SQS应该向Android应用程序发送notifn消息(而不是从demoAndroidAppNotification直接向Android手机发送notifn)。我怎样才能做到呢?很抱歉,我没有使用这些服务或移动通知的经验。但是通过阅读一些文档,我认为没有理由在Android推送通知中使用SQS——SNS只是直接发送,不需要使用SQS排队。SQS是队列,它本身不主动发送任何内容。或者你想在你的应用程序中轮询通知?OP想知道如何在Java中设置AWS SNS订阅策略,而不是如何向SNS发送消息等等,这是离题的我想OP想知道如何在Java中设置AWS SNS订阅策略,而不是如何向SNS发送消息等等,我想这是离题的