Amazon Elasticsearch service 403-forbidden error

时间:2017-03-17 06:42:50

标签: amazon-web-services aws-sdk amazon-iam amazon-elasticsearch

我无法使用amazon java SDK和IAm用户凭据从我的亚马逊弹性搜索群集中获取结果。现在的问题是,当PATH字符串等于“/”时,我能够正确获取结果但是当我尝试使用不同的路径进行例如“/ private-search”时,我得到403禁止错误。即使对于具有公共访问权限的路径,我也会为此IAm用户收到403禁用错误,但如果我删除“signer.sign(requestToSign,credentials);”在performSigningSteps方法中的行(仅适用于公共资源)。

我在AWS中的政策使此IAM用户可以访问我的弹性搜索服务中的所有内容。还有什么办法可以避免在源代码中对访问密钥和密钥进行硬编码?

private static final String SERVICE_NAME = "es";

private static final String REGION = "region-name";

private static final String HOST = "host-name";

private static final String ENDPOINT_ROOT = "http://" + HOST;

private static final String PATH = "/private-search";

private static final String ENDPOINT = ENDPOINT_ROOT + PATH;

private static String accessKey = "IAmUserAccesskey"

private static String secretKey = "IAmUserSecretkey"

public static void main(String[] args) {
       // Generate the request
       Request<?> request = generateRequest();
      // Perform Signature Version 4 signing
       performSigningSteps(request);
     // Send the request to the server
       sendRequest(request);
}

private static Request<?> generateRequest() {
    Request<?> request = new DefaultRequest<Void>(SERVICE_NAME);
    request.setContent(new ByteArrayInputStream("".getBytes()));
    request.setEndpoint(URI.create(ENDPOINT));
    request.setHttpMethod(HttpMethodName.GET);
    return request;
}

private static void performSigningSteps(Request<?> requestToSign) {
    AWS4Signer signer = new AWS4Signer();
    signer.setServiceName(requestToSign.getServiceName());
    signer.setRegionName(REGION);       
    AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
    signer.sign(requestToSign, credentials);
}

private static void sendRequest(Request<?> request) {
    ExecutionContext context = new ExecutionContext();

    ClientConfiguration clientConfiguration = new ClientConfiguration();
    AmazonHttpClient client = new AmazonHttpClient(clientConfiguration);

    MyHttpResponseHandler<Void> responseHandler = new MyHttpResponseHandler<Void>();
    MyErrorHandler errorHandler = new MyErrorHandler();
    Void response = client.execute(request, responseHandler, errorHandler, context);
}


public static class MyHttpResponseHandler<T> implements HttpResponseHandler<AmazonWebServiceResponse<T>> {

    @Override
    public AmazonWebServiceResponse<T> handle(com.amazonaws.http.HttpResponse response) throws Exception {

        InputStream responseStream = response.getContent();
        String responseString = convertStreamToString(responseStream);
        System.out.println(responseString);

        AmazonWebServiceResponse<T> awsResponse = new AmazonWebServiceResponse<T>();
        return awsResponse;
    }

    @Override
    public boolean needsConnectionLeftOpen() {
        return false;
    }
}



public static class MyErrorHandler implements HttpResponseHandler<AmazonServiceException> {

    @Override
    public AmazonServiceException handle(com.amazonaws.http.HttpResponse response) throws Exception {
        System.out.println("In exception handler!");

        AmazonServiceException ase = new AmazonServiceException("exception.");
        ase.setStatusCode(response.getStatusCode());
        ase.setErrorCode(response.getStatusText());
        return ase;
    }

    @Override
    public boolean needsConnectionLeftOpen() {
        return false;
    }
}

public static String convertStreamToString(InputStream is) throws IOException {
    // To convert the InputStream to String we use the
    // Reader.read(char[] buffer) method. We iterate until the
    // Reader return -1 which means there's no more data to
    // read. We use the StringWriter class to produce the string.
    if (is != null) {
        Writer writer = new StringWriter();

        char[] buffer = new char[1024];
        try {
            Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            int n;
            while ((n = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, n);
            }
        }
        finally {
            is.close();
        }
        return writer.toString();
    }
    return "";
}

0 个答案:

没有答案