AWS CDK 雅典娜数据源

问题描述 投票:0回答:2

我如何在 AWS CDK 中创建一个 Athena 数据源,它是使用

AthenaJdbcConnector
?

与 MySQL 数据库的 JDBC 连接

我相信我可以使用

aws-sam
CfnApplication
创建
AthenaJdbcConnector
Lambda,但我如何将它连接到 Athena?

我注意到 CDK 中有很多 Glue 支持将传输到 Athena(数据目录),并且在其他模块(例如 QuickSight)中有几种

CfnDataSource
类型,但我在 CDK 中的 Athena 下没有看到任何东西。

请参阅下面的图片和参考资料。

参考资料:

amazon-web-services aws-lambda amazon-athena aws-cdk aws-sam
2个回答
4
投票

我一直在玩同样的问题。这是我为联合查询创建 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 上设置为环境变量,但我发现没有办法做到这一点。 Application 模板根本不允许这样做,所以这是一个手动的后处理。如果他们对此有解决方案,我肯定想听听任何人的意见!

另请注意,我直接在 jdbc URL 中添加了用户/密码。我想使用 SecretsManager,但由于 Lambda 部署在 VPC 中,它只是拒绝连接到 secretsmanager。我认为这可以通过向 SSM 添加专用 VPN 连接来解决。再次 - 我想听听任何人是否尝试过。


0
投票

请勿复制粘贴顶级解决方案。它将数据库密码硬编码为明文云形成。

正如 OP 所暗示的那样:正确的解决方案是在您将连接器部署到的 VPC 中为 SecretsManager 创建一个接口端点。您还必须在 VPC 中启用 DNS。这反映在 关于 Athena 数据源连接器的 AWS 文档中

要将 Athena 联合查询功能与 AWS Secrets Manager 结合使用,您必须为 Secrets Manager 配置一个 Amazon VPC 私有终端节点。有关更多信息,请参阅 AWS Secrets Manager 用户指南中的创建 Secrets Manager VPC 私有终端节点。

© www.soinside.com 2019 - 2024. All rights reserved.