AWS S3证书/证书错误

问题描述:

我完全陌生于AWS。我试图使用AWS S3通知API。我收到以下错误。AWS S3证书/证书错误

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); 
     }   
    } 
} 
+0

我用错了凭据。但我得到错误消息:线程“主”中的异常com.amazonaws.services.sns.model.AuthorizationErrorException:无权订阅内部端点(服务:AmazonSNS;状态码:403;错误代码:AuthorizationError;我该如何订阅到内部端点?我试图使用控制台,但没有任何地方。 – user6884612

+0

你的问题的性质已经发生了很大的变化,你不能这样做:'InetAddress.getLocalHost()。getHostAddress()+“ :“+ port);'这是返回一个私有的(”内部端点“)IP地址。 SNS只会提供给互联网可访问的端点。 SNS位于AWS内部,但它位于VPC之外,因此它可以从外部访问您。 –

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

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

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

请参见:Managing Access to Your Amazon SNS Topics