我一直在玩同样的问题。这是我为联合查询(Typescript)创建 Lambda 所做的:
const vpc = ec2.Vpc.fromLookup(this, 'my-project-vpc', {
vpcId: props.vpcId
});
const cluster = new rds.ServerlessCluster(this, 'AuroraCluster', {
engine: rds.DatabaseClusterEngine.AURORA_POSTGRESQL,
parameterGroup: rds.ParameterGroup.fromParameterGroupName(this, 'ParameterGroup', 'default.aurora-postgresql10'),
defaultDatabaseName: 'MyDB',
vpc,
vpcSubnets: {
onePerAz: true
},
scaling: {autoPause: cdk.Duration.seconds(0)} // Optional. If not set, then instance will pause after 5 minutes
});
let password = cluster.secret!.secretValueFromJson('password').toString()
let spillBucket = new Bucket(this, "AthenaFederatedSpill")
let lambdaApp = new CfnApplication(this, "MyDB", {
location: {
applicationId: "arn:aws:serverlessrepo:us-east-1:292517598671:applications/AthenaJdbcConnector",
semanticVersion: "2021.42.1"
},
parameters: {
DefaultConnectionString: `postgres://jdbc:postgresql://${cluster.clusterEndpoint.hostname}/MyDB?user=postgres&password=${password}`,
LambdaFunctionName: "crossref_federation",
SecretNamePrefix: `${cluster.secret?.secretName}`,
SecurityGroupIds: `${cluster.connections.securityGroups.map(value => value.securityGroupId).join(",")}`,
SpillBucket: spillBucket.bucketName,
SubnetIds: vpc.privateSubnets[0].subnetId
}
})
如果您使用 Athena 中的 AWS 控制台向导连接到数据源,这将创建具有默认连接字符串的 lambda。不幸的是,不可能通过 CDK 添加 Athena 目录特定的连接字符串。它应该在 Lambda 上设置为环境变量,但我发现没有办法做到这一点。应用程序模板根本不允许这样做,所以这是一个手工的后期处理。如果他们有解决方案,我肯定想听听任何人的意见!
还请注意,我直接在 jdbc URL 中添加了用户/密码。我想使用 SecretsManager,但由于 Lambda 部署在 VPC 中,它只是拒绝连接到 secretsmanager。我认为这可以通过向 SSM 添加私有 VPN 连接来解决。再说一次 - 我想听听任何尝试过的人。