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);
}
}
}
答
您的应用程序需要提供AWS凭证。这些凭证可以通过几种方法获得:
- 创建IAM用户生成访问密钥和秘密密钥。将凭证包含在configuration file中(将它们放入应用程序并不是一个好主意,因为它们可能会在别处意外发布)。
- 如果在Amazon EC2实例上运行代码,请创建一个IAM角色,并在角色启动时将该角色分配给该实例。然后,凭证将自动提供给在该实例上运行的应用程序。
它也是必要的assign permissions到IAM用户/角色。这些权限授予调用各种AWS API调用的权限。您收到AuthorizationError
这一事实表明所使用的凭证没有足够的权限。
我用错了凭据。但我得到错误消息:线程“主”中的异常com.amazonaws.services.sns.model.AuthorizationErrorException:无权订阅内部端点(服务:AmazonSNS;状态码:403;错误代码:AuthorizationError;我该如何订阅到内部端点?我试图使用控制台,但没有任何地方。 – user6884612
你的问题的性质已经发生了很大的变化,你不能这样做:'InetAddress.getLocalHost()。getHostAddress()+“ :“+ port);'这是返回一个私有的(”内部端点“)IP地址。 SNS只会提供给互联网可访问的端点。 SNS位于AWS内部,但它位于VPC之外,因此它可以从外部访问您。 –