尝试通过【AWS】Glue连接连接到Aurora PostgreSQL 14时,连接失败

首先

AWS Glue的作业可以连接支持JDBC连接的数据库。
通常情况下,像RDS或Redshift这样的实例在VPC内运行且不分配公网IP,但即使在这种配置下,通过使用Glue Connection,也可以从AWS Glue中使用它们。

尽管网络配置和设置没有问题,但在尝试连接Aurora PostgreSQL 14实例时,无法成功,即使Glue Connection具有测试连接性的功能。

本文是为了记录这个事件而存在的。
* 这是截至2023年2月4日的情况。以后可能会有改进的可能性。

简而言之 ér zhī)

尽管网络配置和设置没有问题,但在将Aurora PostgreSQL 14的Cluster/Instance和AWS Glue连接配置在同一VPC内运行时,尝试对Aurora PostgreSQL 14实例进行测试连接会失败。

如果在相同的设置下创建Aurora PostgreSQL 13和AWS Glue连接,测试连接将成功。
另外,尽管Glue连接的测试失败,但如果从Glue作业连接到Aurora PostgreSQL 14,则连接将成功。

这个事件与以下事情是相等的。

AWS Glue可以连接到RDS PostgreSQL。

本文是保留了对上述事件进行验证时的环境、设置等信息的文章。
事象的原因将在另一篇文章中进行说明。

该事件的起因(※尚未调查)

原因尚未调查,但我推测可能是以下这样的情况。

    • PostgreSQL 14で利用可能な認証方式/パスワード保存方式が変わり、デフォルトの挙動においては古い方式が利用できなくなった

 

    Glue connection側では、少なくともデフォルトでは新しい認証方式には対応していない

PostgreSQL:文档:14:21.5. 密码认证
https://www.postgresql.org/docs/14/auth-password.html

尚未调查,但是我认为可以通过设置PostgreSQL集群参数组、Glue连接设置以及Aurora PostgreSQL内的用户密码设置等方法来处理。

环境/构成 /

AWS Glue Connection的规格

我們將在以下的公式文件中,確認在VPC內使用Glue連接的情況下的規格、需求等方面的細節。

在VPC中连接到一个JDBC数据存储- AWS Glue
https://docs.aws.amazon.com/zh_cn/glue/latest/dg/connection-JDBC-VPC.html

    • VPC内でGlue connectionを利用する際、ENIが生成され付与される。このENIは Glue_ というプレフィクスが付与されている。

 

    • Glue connectionには、自己自身からのALL Trafficeを許可するSecurity Group(self-referencing inbound rule for ALL Traffic)を付与する必要がある。

 

    • ENIには、Private IPアドレスのみ付与され、、Public IPアドレスは付与されない

 

    • にもかかわらず、Glue connectionからInternetに接続できる必要がある。従って、NAT Gatewayが必須となる。

 

    Glue connectionを配置するVPCは、 enableDnsHostnames と enableDnsSupport がtrueになっている必要がある。(通常、デフォルトでtrueであるため恐らく問題ないはず。)

亚马逊云服务环境

本文档我在以下环境中进行了验证。进行实际验证时,请根据需要进行适当修改。

    • Region: Oregon (us-west-2)

 

    • VPC:

VPC ID: vpc-00853f493d61474b4
IPv4 CIDR: 172.16.0.0/19
Subnets:

Front:

subnet-058248e462c7eed8f (dev1-Front(AZ1))

Bastion:

subnet-0e3872d1ed35c4b6d (dev1-Bastion(AZ1))

Private:

subnet-0de78a29ad83376cf (dev1-Private(AZ1))

Datastore:

subnet-04270a71b3e4a0844 (dev1-Datastore(AZ1))
subnet-061b2f0caa75a079d (dev1-Datastore(AZ2))
subnet-09b43d0d9d5cf67fa (dev1-Datastore(AZ3))

SecurityGroup:

sg-0480929271b0af727 (default)
sg-0c8e3d416b9303d4d (dev1-Internal)
sg-076a174054d90bf21 (dev1-Maintainer)

NAT Gateway:

RDS Aurora PostgreSQL clusters/insntaces:

DB subnet group: dev1-db-subnet
Aurora PostgreSQL 14

Cluster

Cluster name: examining-aurora-postgresql-14
Cluster endpoint: examining-aurora-postgresql-14.cluster-abcdefghijkl.us-west-2.rds.amazonaws.com

Instance

Instance name: examining-aurora-postgresql-14-instance

Aurora PostgreSQL 13

Cluster:

Cluster name: examining-aurora-postgresql-13
Cluster endpoint: examining-aurora-postgresql-13.cluster-abcdefghijkl.us-west-2.rds.amazonaws.com

Instance:

Instance name: examining-aurora-postgresql-13-instance

EC2:

key pair: looking-into-glue-connections
Instance:

Instance ID: i-0337058a6b2cb1092

IAM Role:

LookingIntoGlueConnectionRole

Glue connection:

Aurora PostgreSQL 14用

Connection name: connection aurora-postgresql-14

Aurora PostgreSQL 13用

Connection name: connection aurora-postgresql-13

GlueConenction検証_Structure.png

检验程序/结果详细信息

创建VPC(子网、路由表、NAT网关)和IAM角色。

首先,我们将创建一个用于操作的虚拟私有云(VPC)和子网。我们将使用以下的CloudFormation 模板(以下简称CFn模板)。

 

这个CFn模板会在执行的区域中创建与VPC相关的资源,但在本文中只使用以下内容。

    • VPC: 172.16.0.0/19のネットワークを作成

Internet Gateway
NAT Gateway: 1つ目のAZにのみ作成
Subnets

Front: デフォルトゲートウェイ(0.0.0.0/0) にInternet Gatewayを指定したサブネット。NAT Gatewayを配置。
Bastion: デフォルトゲートウェイ(0.0.0.0/0) にInternet Gatewayを指定したサブネット。動作確認用踏み台サーバを配置。
Private: デフォルトゲートウェイ(0.0.0.0/0)にNAT Gatewayを指定したサブネット。Glue connectionを配置。
Datastore: VPC外へのルートなし。Aurora PostgreSQL Cluster/Instanceを配置。

Security Group

default: 当該Security Groupが設定されたホストからのトラフィックを全て許可する。
dev1-Internal: 172.16.0.0/19からの全てのトラフィックを許可する。
dev1-Maintainer: 自身の環境のGlobal IPアドレスからのSSH接続を許可する。EC2踏み台サーバへの接続用。

1-1. 创建一个CloudFormation堆栈

使用AWS CLI创建CloudFormation堆栈。根据自己的环境指定各种参数并执行。请注意,如果不指定EnableNatGw=true,将不会创建NAT Gateway和Private Subnet。

$ git clone https://github.com/tmiki/cloud-formation-templates
$ cd ./cloud-formation-templates/

$ aws --profile <your AWS CLI profile> cloudformation deploy \
  --template-file cfn-01-basis.yml \
  --stack-name <stack name> \
  --parameter-overrides \
    EnvName=dev1 \
    AppServiceName=<your app name> \
    IpAddressAllowedSsh=<global IP address(es) with prefix being allowed to connect to VPC via SSH> \
    EnableNatGw=true

完成生成后,请确认所生成的资源。
在本文验证中,因以下ID而创建,因此以后将以此进行说明。

    • Subnets:

Front:

subnet-058248e462c7eed8f (dev1-Front(AZ1))

Bastion:

subnet-0e3872d1ed35c4b6d (dev1-Bastion(AZ1))

Private:

subnet-0de78a29ad83376cf (dev1-Private(AZ1))

Datastore:

subnet-04270a71b3e4a0844 (dev1-Datastore(AZ1))
subnet-061b2f0caa75a079d (dev1-Datastore(AZ2))
subnet-09b43d0d9d5cf67fa (dev1-Datastore(AZ3))

SecurityGroup:

sg-0480929271b0af727 (default)
sg-0c8e3d416b9303d4d (dev1-Internal)
sg-076a174054d90bf21 (dev1-Maintainer)

1-2. 创建IAM角色.

在测试Glue Connection时,将需要以下设置从AWS管理控制台中创建。

    • Role name: LookingIntoGlueConnectionRole

 

    • Trust Relationships: ※後述のものを指定

 

    Permissions: AWSGlueServiceRole(※AWS Managed Policyを利用)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "glue.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
GlueConenction検証_CreateIAMRole.png

创建Aurora PostgreSQL集群

创建2-1.DB子网群组

创建一个用于放置Aurora/RDS实例的数据库子网组。使用以下Datastore子网指定并创建它,这是通过CloudFormation创建的。

    • dev1-Datastore(AZ1): subnet-04270a71b3e4a0844

 

    • dev1-Datastore(AZ2): subnet-061b2f0caa75a079d

 

    dev1-Datastore(AZ3): subnet-09b43d0d9d5cf67fa
$ aws --profile <your AWS CLI profile> rds create-db-subnet-group \
  --db-subnet-group-name 'dev1-db-subnet' \
  --db-subnet-group-description 'A DB subnet group hosts Aurora instances.' \
  --subnet-ids subnet-04270a71b3e4a0844 subnet-061b2f0caa75a079d subnet-09b43d0d9d5cf67fa

创建Aurora PostgreSQL 14的集群。

创建一个适用于Aurora PostgreSQL 14的数据库集群。
指定先前创建的DB子网组。

安全组仅指定以下内容。
连接到Aurora实例的只有即将构建的堡垒服务器和Glue连接,而且它们都在VPC内运行,所以只允许VPC内的全部流量是没有问题的。

    sg-0c8e3d416b9303d4d: dev1-Internal

–master-user-password 可以指定任意密码。

$ aws --profile <your AWS CLI profile> rds create-db-cluster \
  --db-cluster-identifier examining-aurora-postgresql-14 \
  --engine aurora-postgresql --engine-version 14.5 \
  --db-subnet-group-name dev1-db-subnet-datastore \
  --vpc-security-group-ids sg-0c8e3d416b9303d4d \
  --master-username postgres --master-user-password **********

生成集群后,还会生成Cluster endpoint,因此请记下它。

examining-aurora-postgresql-14.cluster-abcdefghijkl.us-west-2.rds.amazonaws.com

创建一个Aurora PostgreSQL 13的集群。

创建一个针对Aurora PostgreSQL 13的DB Cluster。
除了引擎aurora-postgresql之外,其他参数与Aurora PostgreSQL 14的相同。

$ aws --profile <your AWS CLI profile> rds create-db-cluster \
  --db-cluster-identifier examining-aurora-postgresql-13 \
  --engine aurora-postgresql --engine-version 13.9 \
  --db-subnet-group-name dev1-db-subnet-datastore \
  --vpc-security-group-ids sg-0c8e3d416b9303d4d \
  --master-username postgres --master-user-password **********

在创建之后,还会生成Cluster endpoint,记得保存下来。

examining-aurora-postgresql-13.cluster-abcdefghijkl.us-west-2.rds.amazonaws.com

3. 在每个Aurora实例上创建一个测试数据库。

创建密钥对和跳板服务器。

在堡垒子网创建一个跳板服务器。

首先,创建一对密钥。从aws ec2 create-key-pair命令的输出结果中提取私钥,并将其保存到文件中备用。

$ aws --profile <your AWS CLI profile> ec2 create-key-pair \
  --key-name 'looking-into-glue-connections' > key-pair-looking-into-glue-connections.json

从AWS EC2创建密钥对的输出中提取出私钥并保存到文件中。

$ cat key-pair-looking-into-glue-connections.json | jq -r .KeyMaterial > key-pair-looking-into-glue-connections.pem

下一步创建EC2实例。指定分配公共IP地址。

AMI将使用Amazon Linux 2 x86_64的最新版本。截至2023年2月4日,在Oregon(us-west-2)地区的AMI ID如下,但由于时间和地区的不同,实际的ID可能会有所不同,请根据需要确认。

亚马逊 Linux 2 内核版本为 5.10 的 AMI 2.0.20230119.1 x86_64 HVM gp2 镜像为 ami-06e85d4c3149db26a。

子网和安全组是指定在CloudFormation堆栈中创建的内容。

    • Subnet: dev1-Front(AZ1) subnet-058248e462c7eed8f

 

    • Security Group:

sg-0c8e3d416b9303d4d dev1-Internal
sg-076a174054d90bf21 dev1-Maintainer

$ aws --profile <your AWS CLI profile> ec2 run-instances \
  --image-id ami-06e85d4c3149db26a \
  --instance-type t3.micro \
  --key-name looking-into-glue-connections \
  --subnet-id subnet-0e3872d1ed35c4b6d \
  --security-group-ids sg-0c8e3d416b9303d4d sg-076a174054d90bf21

在创建完EC2实例后,你可以确认实例的ID和公共IP地址,记下这些信息。

    Instance ID: i-0337058a6b2cb1092

安装psql命令到台阶服务器。

在登录到上面创建的跳板服务器后,按照以下步骤安装psql命令:
请注意,若不是安装PostgreSQL 14的客户端,将无法进行后续的操作验证。

$ sudo amazon-linux-extras install -y postgresql14
$ psql --version
psql (PostgreSQL) 14.3

3-3. 创建和确认连接到 Aurora PostgreSQL 14 的实例

在Aurora PostgreSQL 14的集群中创建一个新的实例。

$ aws --profile <your AWS CLI profile> rds create-db-instance \
  --db-instance-identifier examining-aurora-postgresql-14-instance \
  --db-cluster-identifier examining-aurora-postgresql-14 \
  --engine aurora-postgresql \
  --db-instance-class db.t3.medium \
  --no-multi-az

完成后,将从跳板服务器连接。
连接目标主机的主机名是在创建集群时确认的,密码将使用在创建集群时指定的密码。

$ psql -h examining-aurora-postgresql-14.cluster-abcdefghijkl.us-west-2.rds.amazonaws.com -U postgres -W
Password:
psql (14.3, server 14.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off)
Type "help" for help.

postgres=> 

我們可以在連接之後創建一個適當的表格,插入紀錄,並確認能夠進行與正常的PostgreSQL相同的操作。備註:在本文中,這項操作並非必需。

postgres=> CREATE TABLE example_users
(
  id serial primary key,
  name text
);
postgres=> INSERT INTO example_users (name) VALUES ('alice');
postgres=> INSERT INTO example_users (name) VALUES ('bob');

创建和验证Aurora PostgreSQL 13实例的连接。

在Aurora PostgreSQL 13的集群中创建一个新的实例。

$ aws --profile <your AWS CLI profile> rds create-db-instance \
  --db-instance-identifier examining-aurora-postgresql-13-instance \
  --db-cluster-identifier examining-aurora-postgresql-13 \
  --engine aurora-postgresql \
  --db-instance-class db.t3.medium \
  --no-multi-az

完成后,将从跳板服务器进行连接。
连接的目标主机名是在创建集群时确认的,密码将使用在创建集群时指定的密码。

$ psql -h examining-aurora-postgresql-13.cluster-abcdefghijkl.us-west-2.rds.amazonaws.com -U postgres -W
Password:
psql (14.3, server 14.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off)
Type "help" for help.

postgres=> 

在连接之后,创建一个合适的表格并插入记录,确认可以进行与常规的PostgreSQL相等的操作。请注意,在本文中此步骤不是必需的。

postgres=> CREATE TABLE example_users
(
  id serial primary key,
  name text
);
postgres=> INSERT INTO example_users (name) VALUES ('charlie');
postgres=> INSERT INTO example_users (name) VALUES ('david');

4.创建和测试胶水连接

4-1.胶水连接的规格和注意事项

截至2023年2月4日,目前在AWS Management Console上,AWS Glue相關的控制台已分成幾個部分。

有三个控制台,需要根据需要选择使用。某些功能尚不可用于新的AWS Glue控制台,这些功能需要从”AWS Glue(legacy)”中使用。

    • AWS Glue

 

    • AWS Glue Studio

 

    AWS Glue(legacy)

胶水连接也是其中之一的连接测试。

测试 AWS Glue 连接。请参考以下地址:https://docs.aws.amazon.com/glue/latest/dg/console-test-connections.html。

注意
要测试一个连接,你必须在AWS Glue控制台的连接(传统方式)页面上进行操作。AWS Glue Studio目前不支持连接测试功能。

4-2.与Aurora PostgreSQL 14建立连接(连接测试失败)

从AWS Glue控制台通过AWS管理控制台进行操作。

目前,Glue Connection的创建URL位于AWS Glue Studio平台上。
您可以从以下URL开始创建Glue Connection。

 

GlueConenction検証_CreateAndTestGlueConnection_1_2.png

我们将使用以下参数来创建Glue Connection。

    • Connection properties:

Name: connection aurora-postgresql-14
Connection type: JDBC
Require SSL connection: ☐

Connection access:

JDBC URL:

jdbc:postgresql://examining-aurora-postgresql-14.cluster-abcdefghijkl.us-west-2.rds.amazonaws.com:5432/postgres

Credential type: Username and password
Username: postgres
Password: **********

Network options:

VPC: vpc-00853f493d61474b4
Subnet: subnet-0de78a29ad83376cf (dev1-Private(AZ1))
Security groups:

sg-0c8e3d416b9303d4d (dev1-Internal)
sg-0480929271b0af727 (default)

完成Glue连接后,将进行测试。
目前,AWS Glue Studio和AWS Glue Console上没有可以进行测试的功能。

我会在 AWS Glue 控制台(旧版)上进行测试。

 

GlueConenction検証_CreateAndTestGlueConnection_1_4.png
GlueConenction検証_CreateAndTestGlueConnection_1_5.png
GlueConenction検証_CreateAndTestGlueConnection_1_6.png

在CloudWatch Logs上,Glue的日志将被记录。
会输出类似以下的错误消息。

Check that your connection definition references your JDBC database with correct URL syntax, username, and password. The authentication type 10 is not supported. Check that you have configured the pg_hba.conf file to include the client's IP address or subnet, and that it is using an authentication scheme supported by the driver.
Exiting with error code 30
GlueConenction検証_CreateAndTestGlueConnection_1_8.png

4-3. 连接至Aurora PostgreSQL 13(连接测试成功)。

我将使用AWS Glue控制台从AWS管理控制台进行操作。

目前,Glue Connection的创建URL位于AWS Glue Studio上。您可以通过以下URL进行Glue Connection的创建。

 

GlueConenction検証_CreateAndTestGlueConnection_2_2.png

具体而言,使用指定的参数创建Glue Connection。

    • Connection properties:

Name: connection aurora-postgresql-13
Connection type: JDBC
Require SSL connection: ☐

Connection access:

JDBC URL:

jdbc:postgresql://examining-aurora-postgresql-13.cluster-abcdefghijkl.us-west-2.rds.amazonaws.com:5432/postgres

Credential type: Username and password
Username: postgres
Password: **********

Network options:

VPC: vpc-00853f493d61474b4
Subnet: subnet-0de78a29ad83376cf (dev1-Private(AZ1))
Security groups:

sg-0c8e3d416b9303d4d (dev1-Internal)
sg-0480929271b0af727 (default)

完成Glue连接后,将进行测试。
目前,在AWS Glue Studio和AWS Glue控制台上没有测试功能。

在AWS Glue控制台(传统版)上进行测试。
检查所需的Glue连接,并点击“测试连接”按钮。

 

GlueConenction検証_CreateAndTestGlueConnection_2_4.png
GlueConenction検証_CreateAndTestGlueConnection_2_5.png
GlueConenction検証_CreateAndTestGlueConnection_2_7.png

在CloudWatch Logs上,Glue的日志会被输出。
如下所示,将输出连接成功的消息。
请注意,如果连接测试成功,AWS Glue控制台(旧版)上将不会显示链接。您需要自行跟踪AWS管理控制台。

JDBC Connection successful to jdbc:postgresql://examining-aurora-postgresql-13.cluster-abcdefghijkl.us-west-2.rds.amazonaws.com:5432/postgres
GlueConenction検証_CreateAndTestGlueConnection_2_8.png

5. 删除资源

5-1. 删除跳板服务器.

使用AWS CLI删除EC2实例。

$ aws --profile <your AWS CLI profile> ec2 terminate-instances \
  --instance-ids i-0337058a6b2cb1092

删除5-2胶水连接

我們將從 AWS 管理控制台中進行刪除。

 

删除「connection aurora-postgresql-14」。

GlueConenction検証_DeleteGlueConnection_1_2.png

删除「connection aurora-postgresql-13」。

GlueConenction検証_DeleteGlueConnection_2_2.png

删除Aurora PostgreSQL 14集群/实例。

首先,使用AWS CLI从Aurora集群/实例中删除。
先删除实例,然后再删除集群。

$ aws --profile <your AWS CLI profile> rds delete-db-instance \
  --db-instance-identifier examining-aurora-postgresql-14-instance
$ aws --profile <your AWS CLI profile> rds delete-db-cluster \
  --db-cluster-identifier examining-aurora-postgresql-14 \
  --skip-final-snapshot

5-4. 删除Aurora PostgreSQL 13 集群/实例

首先,使用AWS CLI删除Aurora集群/实例。
首先,删除实例,然后删除集群。

$ aws --profile <your AWS CLI profile> rds delete-db-instance \
  --db-instance-identifier examining-aurora-postgresql-13-instance
$ aws --profile <your AWS CLI profile> rds delete-db-cluster \
  --db-cluster-identifier examining-aurora-postgresql-13 \
  --skip-final-snapshot

5-5.VPC删除等

在AWS CLI中,首先删除CloudFormation堆栈,然后删除所有相关的VPC资源。然后,将目录更改为克隆的Git存储库,并通过AWS CLI从中删除。

$ cd ${path to your local git repository}/cloud-formation-templates/
$ aws --profile <your AWS CLI profile> cloudformation delete-stack --stack-name dev1-01-basis

最后

暂时我已经整理了关于Aurora PostgreSQL 14无法通过Glue Connection进行连接测试失败的问题的草稿。
关于该问题的原因和解决方案,我计划另行调查并撰写文章。

广告
将在 10 秒后关闭
bannerAds