Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java应用程序中使用Amazon Web服务策略语句?_Java_Amazon Web Services_Amazon Sqs_Amazon Sns_Spring Cloud - Fatal编程技术网

如何在Java应用程序中使用Amazon Web服务策略语句?

如何在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

我想从后端Java应用程序向AmazonSQS队列发送AmazonSNS消息。根据《SNS开发者指南》(),在“将亚马逊SNS消息发送到亚马逊SQS队列”一节中的主题-“步骤2.允许亚马逊SNS主题将消息发送到亚马逊SQS队列”,其内容如下:

如果您想自己创建策略文档,您可以创建 像下面这样的政策。该策略允许MyTopic发送 发送到MyQueue的消息

我的疑问是如何在java应用程序中使用这个策略文档(.json文件,如果我没有错的话),以及在哪里使用它?因为我必须在队列上设置一个允许Amazon SNS主题执行sqs:SendMessage操作的策略。
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发送消息等等,我想这是离题的