EC2 is not able to GetSecretValue

0

I have a secret, my-secret-1 in Account A. I want to access this secret from Account B using resource-based policy.

I have followed below document for instructions, https://aws.amazon.com/blogs/database/design-patterns-to-access-cross-account-secrets-stored-in-aws-secrets-manager/

Below is my resource-based policy attached to the secret in AccountA

{
  "Version" : "2012-10-17",
  "Statement" : [ {
    "Sid" : "AllowAccountAAccess",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::accountANumber:root"
    },
    "Action" : "secretsmanager:GetSecretValue",
    "Resource" : "*"
  }, {
    "Sid" : "RestrictAccess",
    "Effect" : "Deny",
    "Principal" : "*",
    "Action" : "secretsmanager:GetSecretValue",
    "Resource" : "*",
    "Condition" : {
      "ArnNotLike" : {
        "aws:PrincipalArn" : [ "arn:aws:iam::accountBNumber:role/accountB-IAMRole-*" ]
      }
    }
  } ]
}

This works fine when i access from EC2 instance in accountB using below command, aws secretsmanager get-secret-value --secret-id "AccountASercretArn" --region "us-east-1"

But the spring java program installed in EC2 instance is failing to get the secret with below error,

com.amazonaws.services.secretsmanager.model.AWSSecretsManagerException: User: arn:aws:sts::AccountA:assumed-role/AccountA-1XHHJOW5RFKUT/i-1221ds12238 is not authorized to perform: secretsmanager:GetSecretValue on resource: my-secret-1 because no identity-based policy allows the secretsmanager:GetSecretValue action (Service: AWSSecretsManager; Status Code: 400; Error Code: AccessDeniedException; Request ID: 1qqq16169-sa2-2ddd-s344ff; Proxy: null)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1879)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleServiceErrorResponse(AmazonHttpClient.java:1418)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1387)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1157)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:814)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:781)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:755)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:715)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:697)
	at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:561)
	at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:541)
	at com.amazonaws.services.secretsmanager.AWSSecretsManagerClient.doInvoke(AWSSecretsManagerClient.java:2783)
	at com.amazonaws.services.secretsmanager.AWSSecretsManagerClient.invoke(AWSSecretsManagerClient.java:2750)
	at com.amazonaws.services.secretsmanager.AWSSecretsManagerClient.invoke(AWSSecretsManagerClient.java:2739)
	at com.amazonaws.services.secretsmanager.AWSSecretsManagerClient.executeGetSecretValue(AWSSecretsManagerClient.java:1078)
	at com.amazonaws.services.secretsmanager.AWSSecretsManagerClient.getSecretValue(AWSSecretsManagerClient.java:1047)

java code:

@Bean
    public AWSSecretsManager secretsManager(final Region region) {
        return AWSSecretsManagerClientBuilder.standard()
                .withRegion(region.getName())
                .build();
    }

public GetSecretValueResult getGetSecretValueResult(final AWSSecretsManager secretsManager) {
        try {
            final GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest().withSecretId("my-secret-1");
            return secretsManager.getSecretValue(getSecretValueRequest);
        } catch (final Throwable e) {
        }
    }
1 Risposta
0
Risposta accettata

In the java code instead of passing secret name as .withSecretId("my-secret-1"), passed the complete arn of the secret which resolved the issue!

sucha
con risposta 10 mesi fa
profile picture
ESPERTO
verificato un mese fa

Accesso non effettuato. Accedi per postare una risposta.

Una buona risposta soddisfa chiaramente la domanda, fornisce un feedback costruttivo e incoraggia la crescita professionale del richiedente.

Linee guida per rispondere alle domande