Unable to calculate a request signature: Empty key
0
Experts, We have written a small java program to get the value of an attribute stored in the Amazon Simple DB database. This program is part of a java action and called from a microflow in a test mendix app. When I run my app locally, the program works fine and returns me the attribute value. However, when I deploy my app to mendix cloud, the same java action throws the below error. Appreciate if anyone can suggest what is needed for the java action to work anywhere.. 3:32:00 PMAPPat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:933) 3:32:00 PMAPPat org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1077) 3:32:00 PMAPPat java.base/java.lang.Thread.run(Unknown Source) 3:32:00 PMAPPCaused by: com.amazonaws.SdkClientException: Unable to calculate a request signature: Empty key 3:32:00 PMAPPat com.amazonaws.auth.AbstractAWSSigner.sign(AbstractAWSSigner.java:132) 3:32:00 PMAPPat com.amazonaws.auth.AbstractAWSSigner.signAndBase64Encode(AbstractAWSSigner.java:92) 3:32:00 PMAPPat com.amazonaws.auth.AbstractAWSSigner.signAndBase64Encode(AbstractAWSSigner.java:82) 3:32:00 PMAPPat com.amazonaws.auth.QueryStringSigner.sign(QueryStringSigner.java:96) 3:32:00 PMAPPat com.amazonaws.auth.QueryStringSigner.sign(QueryStringSigner.java:50) 3:32:00 PMAPPat com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1320) 3:32:00 PMAPPat com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1157) 3:32:00 PMAPPat com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:814) 3:32:00 PMAPPat com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:781) 3:32:00 PMAPPat com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:755) 3:32:00 PMAPPat com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:715) 3:32:00 PMAPPat com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:697) 3:32:00 PMAPPat com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:561) 3:32:00 PMAPPat com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:541) Here’s my sample program: ======================= package myfirstmodule.actions; import com.mendix.systemwideinterfaces.core.IContext; import com.mendix.webui.CustomJavaAction; import java.util.List; import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpledb.AmazonSimpleDB; import com.amazonaws.services.simpledb.AmazonSimpleDBClientBuilder; import com.amazonaws.services.simpledb.model.Attribute; import com.amazonaws.services.simpledb.model.GetAttributesRequest; import com.amazonaws.services.simpledb.model.GetAttributesResult; public class AWSSimpleDBTest extends CustomJavaAction<java.lang.String> { private java.lang.String accessKeyID; private java.lang.String secretAccessKey; private java.lang.String domainName; private java.lang.String userName; public AWSSimpleDBTest(IContext context, java.lang.String accessKeyID, java.lang.String secretAccessKey, java.lang.String domainName, java.lang.String userName) { super(context); this.accessKeyID = accessKeyID; this.secretAccessKey = secretAccessKey; this.domainName = domainName; this.userName = userName; } @java.lang.Override public java.lang.String executeAction() throws Exception { // BEGIN USER CODE //throw new com.mendix.systemwideinterfaces.MendixRuntimeException("Java action was not implemented"); BasicAWSCredentials awsCredentials = new BasicAWSCredentials(this.accessKeyID, this.secretAccessKey); AmazonSimpleDB sdb = AmazonSimpleDBClientBuilder.standard() .withRegion("eu-west-1") .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) .build(); String assetId = null; GetAttributesRequest Request = new GetAttributesRequest(); Request.setDomainName(this.domainName); Request.setItemName(this.userName); Request.setConsistentRead(true); GetAttributesResult Response = sdb.getAttributes(Request); List<Attribute> list = Response.getAttributes(); for (Attribute item : list) { if ("assetId".equals(item.getName())) { assetId = item.getValue(); break; } } System.out.println(); return assetId; // END USER CODE } /** * Returns a string representation of this action * @return a string representation of this action */ @java.lang.Override public java.lang.String toString() { return "AWSSimpleDBTest"; } // BEGIN EXTRA CODE // END EXTRA CODE }
asked
Kalyan Guda
1 answers
0
Hi John,
Thanks for your response. Actually, I did figure out the root cause. I had defined couple of constants for capturing the AWS Access and Secret Keys. These constants worked fine whenever I ran my app locally. However, I noticed that the values for these constants showed up as empty after the app was deployed to the cloud. I had to go to the Environments → Model Options tab and manually update the values. Then, the app started working fine.