首页 > 解决方案 > AWS CDK Athena 数据源

问题描述

如何在 AWS CDK 中创建 Athena 数据源,该数据源是使用 JDBC 连接到 MySQL 数据库的AthenaJdbcConnector

我相信我可以使用aws-sam'sCfnApplication来创建AthenaJdbcConnectorLambda,但是如何将它连接到 Athena?

我注意到 CDK 中的很多 Glue 支持将转移到 Athena(数据目录),并且在其他模块(例如 QuickSight)中有几种CfnDataSource类型,但我在 CDK 中的 Athena 下没有看到任何内容。

请参阅下面的图像和参考。

参考:

标签: amazon-web-servicesaws-lambdaamazon-athenaaws-cdkaws-sam

解决方案


我一直在玩同样的问题。这是我为联合查询(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 连接来解决。再一次 - 我想听听任何尝试过的人。


推荐阅读