I am using Java. I am using an "assume role" for sending email. When the below code is deployed, a NoClassDefFoundError is thrown.
\[2024-01-08 09:57:14,179\] ERROR {org.apache.synapse.config.xml.ClassMediatorFactory} - Error in instantiating class : org.capgemini.ciap.core.CoreJSONPayloadUtils
java.lang.NoClassDefFoundError: software/amazon/awssdk/auth/credentials/AwsCredentialsProvider
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3137)
at java.base/java.lang.Class.getConstructor0(Class.java:3342)
at java.base/java.lang.Class.newInstance(Class.java:556)
at org.apache.synapse.config.xml.ClassMediatorFactory.createSpecificMediator(ClassMediatorFactory.java:110)
This is my java code.
import software.amazon.awssdk.auth.credentials.*;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.ses.SesClient;
import software.amazon.awssdk.services.ses.model.*;
import software.amazon.awssdk.services.sts.StsClient;
import software.amazon.awssdk.services.sts.model.AssumeRoleRequest;
import software.amazon.awssdk.services.sts.model.StsException;
import software.amazon.awssdk.services.sts.model.AssumeRoleResponse;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.services.sts.model.Credentials;
@SuppressWarnings("deprecation")
static void awsMailService(MessageContext context) {
context.setProperty("ERROR_CODE", "");
log.info("inside SendSESMail Java class");
log.info(">> AWS_ROLE_ARN: " + context.getProperty("AWS_ROLE_ARN"));
log.info(">> AWS_ROLE_SESSION_NAME: " + context.getProperty("AWS_ROLE_SESSION_NAME"));
log.info(">> AWS_WEB_IDENTITY_TOKEN_FILE: " + context.getProperty("AWS_WEB_IDENTITY_TOKEN_FILE"));
try {
String roleArn = context.getProperty("AWS_ROLE_ARN").toString();
String roleSessionName = context.getProperty("AWS_ROLE_SESSION_NAME").toString();
Region region = Region.US_EAST_1;
StsClient stsClient = StsClient.builder()
.region(region)
.credentialsProvider(ProfileCredentialsProvider.create())
.build();
Credentials myCreds = assumeGivenRole(stsClient, roleArn, roleSessionName);
AwsSessionCredentials awsCreds = AwsSessionCredentials.create(myCreds.accessKeyId(), myCreds.secretAccessKey(), roleSessionName);
SesClient sesClient = SesClient.builder()
.region(region)
.credentialsProvider(StaticCredentialsProvider.create(awsCreds))
.build();
String sender = "xxx.com";
String recipient = "xxxx";
Content subject = Content.builder().data("Test Email").build();
Content body = Content.builder().data("This is a test email").build();
Body emailBody = Body.builder().text(body).build();
Message message = Message.builder().subject(subject).body(emailBody).build();
SendEmailRequest sendEmailRequest = SendEmailRequest.builder()
.source(sender)
.destination(Destination.builder().toAddresses(recipient).build())
.message(message)
.build();
SendEmailResponse sendEmailResponse = sesClient.sendEmail(sendEmailRequest);
System.out.println("Email sent! Message ID: " + sendEmailResponse.messageId());
} catch (Throwable th) {
log.error("The email was not sent. Error message in java code: ", th);
context.setProperty("ERROR_CODE", "500");
context.setProperty("ERROR_MESSAGE", th.getMessage());
context.setProperty("ERROR_DETAIL", "Error in java code: awsMailService");
}
}
public static Credentials assumeGivenRole(StsClient stsClient, String roleArn, String roleSessionName) {
AssumeRoleRequest roleRequest = AssumeRoleRequest.builder()
.roleArn(roleArn)
.roleSessionName(roleSessionName)
.build();
AssumeRoleResponse roleResponse = stsClient.assumeRole(roleRequest);
Credentials myCreds = roleResponse.credentials();
return myCreds;
}