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
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.

answered