-
Notifications
You must be signed in to change notification settings - Fork 4k
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
aws-appconfig: SourcedConfiguration doesn't use retrievalRole #30609
aws-appconfig: SourcedConfiguration doesn't use retrievalRole #30609
Comments
@maikbasel Good afternoon. Thanks for opening the issue. Could you please share minimal self-contained code to troubleshoot the issue? This would ensure quick reproduction and mimic the same scenario. Thanks, |
This issue has not received a response in a while. If you want to keep this issue open, please leave a comment below and auto-close will be canceled. |
@ashishdhingra I updated the issue with a simplyfied code example. |
Reproducible. Appears to be an issue at this code, where it is using ternary operator that always creates a new role if the condition is met. (for comparison, refer code for CodeBuild). The mentioned code for AppConfig should instead be written as below to achieve the desired behavior (notice the added parenthesis to avoid the 2nd condition to be part of 1st check this.retrievalRole = props.retrievalRole || (this.location.type != ConfigurationSourceType.CODE_PIPELINE
? new iam.Role(this, 'Role', {
roleName: PhysicalName.GENERATE_IF_NEEDED,
assumedBy: new iam.ServicePrincipal('appconfig.amazonaws.com'),
inlinePolicies: {
['AllowAppConfigReadFromSourcePolicy']: this.getPolicyForRole(),
},
})
: undefined); As a simple test, use the following JavaScript code below: var x = "foo";
var condition = 'test';
var somevalue = x || condition != 'test1' ? 'Hi' : undefined; // the value of somevalue will be 'Hi'
var somevalueCorrect = x || (condition != 'test1' ? 'Hi' : undefined); // the value of somevalueCorrect will be 'foo' |
Agree and the doc string for this prop is incorrect. This means it would only generate a new one if undefined. aws-cdk/packages/aws-cdk-lib/aws-appconfig/lib/configuration.ts Lines 487 to 492 in 7f5ce4b
But actually it's not aws-cdk/packages/aws-cdk-lib/aws-appconfig/lib/configuration.ts Lines 567 to 575 in 7f5ce4b
I would suggest change to code to this.retrievalRole = props.retrievalRole ?? this.createAppConfigRetrievalRole(); And implement a private createAppConfigRetrievalRole() construct method in the bottom of the constructor, that would be easier to read. For example private createAppConfigRetrievalRole(): iam.Role | undefined {
// Check if a custom retrieval role is provided
if (this.props.retrievalRole) {
return this.props.retrievalRole;
}
// Check if the configuration source is not from CodePipeline
if (this.location.type !== ConfigurationSourceType.CODE_PIPELINE) {
return new iam.Role(this, 'AppConfigRetrievalRole', {
roleName: 'AppConfigRetrievalRole',
assumedBy: new iam.ServicePrincipal('appconfig.amazonaws.com'),
managedPolicies: [
iam.ManagedPolicy.fromAwsManagedPolicyName('AWSAppConfigFullAccess'),
],
});
}
// No role is needed if the configuration source is from CodePipeline
return undefined;
} Also, I am not sure why it only creates a new role when If you believe it's not required and should be fixed, please share relevant doc in this thread and we welcome the pull requests. |
### Issue # (if applicable) Closes #30609 ### Reason for this change To refactor the retrievalRole creation logic. ### Description of changes ### Description of how you validated changes Unit tests: 1. configuration with retrievalRole undefined from bucket source should create a new role 2. configuration with retrievalRole defined should NOT create a new role and should use the passed role for the retrievalRoleArn 3. configuration with retrievalRole undefined from CodePipeline source should NOT create a new role Integ test: 1. update the existing integ test to assert a use case where the retrievalRole is provided. ### Checklist - [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
Comments on closed issues and PRs are hard for our team to see. |
Describe the bug
The SourcedConfiguration construct does not make use of it's retrievalRole property regardless of wether is defined or not. It will always create a new IAM Role (except when it's location type is ConfigurationSourceType.CODE_PIPELINE then it will default to undefined).
I encountered this behavior while trying to use role of mine created in a different stack and encountered an error that the role used was not allowed to retrieve the secret my configuration profile should reference.
Expected Behavior
The SourcedConfiguration should make use of the role passed to it via the retrievalRole property.
Current Behavior
The SourcedConfiguration will always create a new IAM Role instead of using the role passed into it via the retrievalRole property.
Reproduction Steps
Here a simplyfied version of my code:
StackA:
StackB:
Possible Solution
The condition in the SourcedConfigurations constructor checking wether the retrievalRole is defined is wrong. As I already wrote, regardless of wether retrievalRole is defined or not. It will always create a new IAM Role (except when it's location type is ConfigurationSourceType.CODE_PIPELINE then it will default to undefined). This makes no sense. If the retrievalRole is defined it should use this role.
Additional Information/Context
No response
CDK CLI Version
2.146.0
Framework Version
No response
Node.js Version
20.14.0
OS
Windows 10
Language
TypeScript
Language Version
No response
Other information
No response
The text was updated successfully, but these errors were encountered: