-
Notifications
You must be signed in to change notification settings - Fork 4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[DatabaseProxy] Model validation failed (#: required key [TargetGroupName] not found) #8885
Comments
I also tried below but still failed. cluster.addProxy('DatabaseProxy', {
secret,
vpc,
vpcSubnets: {
subnetType: ec2.SubnetType.PRIVATE,
},
}); |
I have hit the same issue, tried DatabaseCluster and DatabaseInstance (MySQL, Postgres and Aurora MySQL) - no difference |
Incase it helps whoever picks this up, when digging in earlier. The only place I can see TargetGroupName is set is inside CfnDBProxyTargetGroup as cdk.Token.asString(this.getAtt('TargetGroupName')); |
I'll take a look. |
Thanks! |
This was my original workaround:
This caused the same required key [TargetGroupName] error. After many hours of struggling and diving into the cdk source I realized there is no place where TargetGroupName* seems to be assigned to the target group, expept has has been pointed out, in
TargetGroupName is not documented and assigning anything but default caused an enum error. In cdk 1.49.0 the DatabaseProxy class was finally added, alongside the very helpful rdsInstance.addProxy(...) for which I am very thankful. However, I notice in the new proxy.ts file that was introduced calls the following
yet without again assigning the TargetGroupName. Hence the error still remaining. You can thus solve the error by adding the following at the end of your code after
I just tested these two lines on the new implementation of the cdk rds proxy class and it is working with my new db stack. I hope this helps. |
That's awesome! I will try the workaround. |
Sorry for inconvenience caused. It seems something has suddenly changed in CloudFormation. (They implicitly set TargetGroupName before) Fortunately, I can find the point early with your help. I hope this would work. |
Another problem has happened. After I applying this patch, the deployment was failed with the message "Timed out waiting for target group to become available.". Does anyone hit the same problem? |
To initialize DB Proxy Target Group,
Check if the security groups specified in the DB Proxy are allowed to access network that DB resides. |
In AWS Management Console: I found that DB Proxy target was staying unavailable when I put a security group which is not allowed to access RDS instance. In CDK or AWS CloudFormation, It will time out. @tbrand Can you open new issue for this? |
@civilizeddev Thanks for the digging!
Is that correct? I thought that the closed security group occurs the timeout. So opened security group would solve the issue. (I haven't try.) |
This is still a work in progress, it will be launched on cdkpatterns in the next couple of days but if you or anyone else following this wants some working code for a MySQL DB Instance, an RDS Proxy and a Lambda function which runs several queries integrated with an API Gateway HTTP API - https://github.com/nideveloper/serverless/blob/master/the-rds-proxy/typescript/lib/the-rds-proxy-stack.ts |
I stumbled into this, and I also had to add another property override, because doing DBCluster#addProxy added both DBClusterIdentifiers and DBInstanceIdentifiers to the ProxyTargetGroup, which is not allowed. So my overrides look like this:
which solves the problems. |
Thanks guys. Finally I successfully created the proxy! 🎉 this.proxy = new rds.DatabaseProxy(this, 'DatabaseProxy', {
dbProxyName: 'database-proxy',
debugLogging: true,
iamAuth: false,
requireTLS: true,
secret: this.secret,
vpc: props.vpc,
vpcSubnets: {
subnetType: ec2.SubnetType.PRIVATE,
},
proxyTarget: rds.ProxyTarget.fromCluster(this.cluster),
});
const targetGroup = this.proxy.node.findChild('ProxyTargetGroup') as rds.CfnDBProxyTargetGroup;
targetGroup.addOverride('Properties.TargetGroupName', 'default');
targetGroup.addOverride('Properties.DBClusterIdentifiers', [this.cluster.clusterIdentifier]);
targetGroup.addOverride('Properties.DBInstanceIdentifiers', []); |
Any updates on this issue? I am using version 1.44 of aws-cdk and deploying a cloudformation stack with It would be very helpful if there would be an official tutorial or example to this as this seems to be a common problem. import { App, Stack, StackProps, Duration } from '@aws-cdk/core'
import { Role, ServicePrincipal, PolicyStatement } from '@aws-cdk/aws-iam'
import {
Vpc,
SecurityGroup,
SubnetType,
InstanceType,
InstanceClass,
InstanceSize,
Port,
ISecurityGroup,
} from '@aws-cdk/aws-ec2'
import {
CfnDBProxyTargetGroup,
DatabaseInstance,
DatabaseInstanceEngine,
DatabaseProxy,
PostgresEngineVersion,
} from '@aws-cdk/aws-rds'
import { Secret } from '@aws-cdk/aws-secretsmanager'
export class PostgresStack extends Stack {
public readonly secret: Secret
public readonly proxy: DatabaseProxy
public readonly instance: DatabaseInstance
public readonly proxySecurityGroup: ISecurityGroup
constructor(scope: App, id: string, props?: StackProps) {
super(scope, id, props)
const vpc = new Vpc(this, 'VPC', {
natGateways: 0,
subnetConfiguration: [{ name: 'postgres', subnetType: SubnetType.PUBLIC }],
})
const proxySecurityGroup = new SecurityGroup(this, 'RDS Proxy Clients', {
vpc,
})
const databaseSecurityGroup = new SecurityGroup(this, 'RDS Database Clients', {
vpc,
})
databaseSecurityGroup.addIngressRule(databaseSecurityGroup, Port.tcp(5432), 'allow db conection')
databaseSecurityGroup.addIngressRule(proxySecurityGroup, Port.tcp(5432), 'allow proxy connection')
this.secret = new Secret(this, 'MasterSecret', {
generateSecretString: {
excludePunctuation: true,
},
})
this.instance = new DatabaseInstance(this, 'PostgresInstance', {
engine: DatabaseInstanceEngine.postgres({ version: PostgresEngineVersion.VER_11 }),
masterUsername: 'master',
masterUserPassword: this.secret.secretValue,
vpc,
vpcPlacement: { subnetType: SubnetType.PUBLIC },
instanceType: InstanceType.of(InstanceClass.T2, InstanceSize.MICRO),
instanceIdentifier: 'CoopSaas-Postgres',
securityGroups: [databaseSecurityGroup],
})
this.instance.connections.allowDefaultPortFromAnyIpv4()
const proxyRole = new Role(this, 'RdsProxyRole', {
assumedBy: new ServicePrincipal('rds.amazonaws.com'),
})
proxyRole.addToPolicy(
new PolicyStatement({
actions: [
'secretsmanager:GetResourcePolicy',
'secretsmanager:GetSecretValue',
'secretsmanager:DescribeSecret',
'secretsmanager:ListSecretVersionIds',
],
resources: [this.secret.secretArn],
}),
)
this.proxy = this.instance.addProxy('PostgresProxy', {
secrets: [this.secret],
vpc,
debugLogging: true,
iamAuth: true,
role: proxyRole,
securityGroups: [databaseSecurityGroup],
borrowTimeout: Duration.seconds(30),
})
let targetGroup = this.proxy.node.children.find((child: any) => {
return child instanceof CfnDBProxyTargetGroup
}) as CfnDBProxyTargetGroup
targetGroup.addPropertyOverride('TargetGroupName', 'default')
}
} |
I'm not a maintainer but I cloud say
|
@tbrand thank you for your response! I found in the CloudWatch LogGroups that RDSProxy requires the RDS credentials to be formated |
I tried DatabaseProxy with Database Cluster (Aurora, Postgres) but it's failed as titled.
Reproduction Steps
Error Log
Environment
Other
This is 🐛 Bug Report
The text was updated successfully, but these errors were encountered: