AWS S3凭据/证书错误

时间:2016-11-21 18:48:51

标签: amazon-web-services amazon-s3

我是AWS的新手。我正在尝试使用AWS S3通知API。我收到以下错误。

com.amazonaws.services.sns.model.AmazonSNSException:请求中包含的安全令牌无效。 (服务:AmazonSNS;状态代码:403;错误代码:InvalidClientTokenId; ...

我不知道出了什么问题。对于我的accessID和secretID。我使用主要AWS代码进行身份验证。我是否应该使用主要AWS凭证或其他内容。我没有使用任何类型的证书。我不知道他们是否需要。

我使用AWS提供的示例代码进行一些修改来读取属性文件,而不是硬编码accessID和secretID。

有人可以引导我朝正确的方向前进吗?我完全糊涂了。

public class AmazonSNSReceiver {
     // AWS credentials -- replace with your credentials
    static String ACCESS_KEY;
    static String SECRET_KEY;

    // Shared queue for notifications from HTTP server
    static BlockingQueue<Map<String, String>> messageQueue = new LinkedBlockingQueue<Map<String, String>>();

    // Receiver loop
    public static void main(String[] args) throws Exception {
        AmazonSNSReceiver sns = new AmazonSNSReceiver();

        sns.getPropertyValues();
        if (args.length == 1) {
        sns.SNSClient(args[0]);
            } else {
                sns.SNSClient("8989");
        }
    }
        // Create a client
        public void SNSClient(String thisport) throws Exception{

        AmazonSNSClient service = new AmazonSNSClient(new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY));

        // Create a topic
        CreateTopicRequest createReq = new CreateTopicRequest().withName("MyTopic");
        CreateTopicResult createRes = service.createTopic(createReq);

        // Get an HTTP Port
        int port = thisport == null ? 8989 : Integer.parseInt(thisport);

        // Create and start HTTP server
        Server server = new Server(port);
        server.setHandler(new AmazonSNSHandler());
        server.start();

        // Subscribe to topic
        SubscribeRequest subscribeReq = new SubscribeRequest()
            .withTopicArn(createRes.getTopicArn())
            .withProtocol("http")
            .withEndpoint("http://" + InetAddress.getLocalHost().getHostAddress() + ":" + port);
        service.subscribe(subscribeReq);

        for (;;) {

            // Wait for a message from HTTP server
            Map<String, String> messageMap = messageQueue.take();

            // Look for a subscription confirmation Token
            String token = messageMap.get("Token");
            if (token != null) {

                // Confirm subscription
                ConfirmSubscriptionRequest confirmReq = new ConfirmSubscriptionRequest()
                    .withTopicArn(createRes.getTopicArn())
                    .withToken(token);
                service.confirmSubscription(confirmReq);

                continue;
            }

            // Check for a notification
            String message = messageMap.get("Message");
            if (message != null) {
                System.out.println("Received message: " + message);
            }

        }

    }

    public void getPropertyValues() throws IOException {

        Properties prop = new Properties();

        InputStream properties = getClass().getClassLoader().getResourceAsStream("SNS.properties");

        prop.load(properties);

        ACCESS_KEY = prop.getProperty("ACCESS_KEY");
        SECRET_KEY = prop.getProperty("SECRET_KEY");

    }

    // HTTP handler
    static class AmazonSNSHandler extends AbstractHandler {

        // Handle HTTP request
        public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException {

            // Scan request into a string
            Scanner scanner = new Scanner(request.getInputStream());
            StringBuilder sb = new StringBuilder();
            while (scanner.hasNextLine()) {
                sb.append(scanner.nextLine());
            }

            // Build a message map from the JSON encoded message
            InputStream bytes = new ByteArrayInputStream(sb.toString().getBytes());
            Map<String, String> messageMap = new ObjectMapper().readValue(bytes, Map.class);

            // Enqueue message map for receive loop
            messageQueue.add(messageMap);

            // Set HTTP response
            response.setContentType("text/html");
            response.setStatus(HttpServletResponse.SC_OK);
            ((Request) request).setHandled(true);
        }        
    }
}

1 个答案:

答案 0 :(得分:0)

您的应用需要提供AWS凭据。这些凭证可以通过以下几种方法获得:

  • 创建 IAM用户并生成访问密钥和密钥。将凭据包含在configuration file中(将它们放在您的应用程序中并不是一个好主意,因为它们可能会意外地在其他地方发布)。
  • 如果在Amazon EC2实例上运行代码,请创建 IAM角色,并在启动时将角色分配给实例。然后,凭据将自动提供给在该实例上运行的应用程序。

IAM用户/角色也必须assign permissions。这些权限授予调用各种AWS API调用的权限。您收到AuthorizationError这一事实表明正在使用的凭据没有足够的权限。

请参阅:Managing Access to Your Amazon SNS Topics