はじめに
AWS Glueのjobは、JDBC接続をサポートしているデータベースに接続することが可能です。
通常、RDSやRedshift等のインスタンスはVPC内で稼働しPublic IPを付与しないで運用していることが多いと思いますが、そのような構成でも、Glue Connectionを利用することでAWS Glueから利用できるようになっています。
Glue Connectionにはその接続性をテストする機能がありますが、ネットワーク構成・設定は問題ないにもかかわらず、Aurora PostgreSQL 14インスタンスに接続しようとすると失敗します。
本稿はその事象について記録を残すものとなります。
※これは2023/2/4時点の状況となります。後々、改善される可能性があります。
概要
Aurora PostgreSQL 14のCluster/Instance、およびAWS Glue connectionを、同一VPC内で稼働させる構成において、ネットワーク構成・設定は問題ないにもかかわらず、Aurora PostgreSQL 14インスタンスにテスト接続しようとすると失敗します。
同等の設定でAurora PostgreSQL 13、AWS Glue connectionを作成すると、テスト接続に成功します
また、Glue Connectionのテストは失敗しますが、Glue jobからAurora PostgreSQL 14に接続する場合は成功します。
以下の事象と同等です。
Aws glue connects to RDS PostgreSQL | AWS re:Post
https://repost.aws/questions/QU5ZDUGnvnREWUT0CA-a6rSw/aws-glue-connects-to-rds-postgre-sql
本稿は、上記の事象を検証した際の環境・設定等を残したものとなります。
事象原因については別途の記事となる予定です。
当該事象の原因(※未調査)
原因は未調査ですが、恐らく以下のような状況であると推測しています。
- PostgreSQL 14で利用可能な認証方式/パスワード保存方式が変わり、デフォルトの挙動においては古い方式が利用できなくなった
- Glue connection側では、少なくともデフォルトでは新しい認証方式には対応していない
PostgreSQL: Documentation: 14: 21.5. Password Authentication
https://www.postgresql.org/docs/14/auth-password.html
PostgreSQL側のCluster parameter groupの設定や、Glue connectionの設定、Aurora PostgreSQL内のユーザのパスワード設定等、何らか対処の方法があるように思いますが、現時点では未調査です。
環境/構成
AWS Glue Connectionの仕様
以下、公式ドキュメントから、Glue ConnectionをVPC内で利用するケースでの仕様、要件等を確認します。
Connecting to a JDBC data store in a VPC - AWS Glue
https://docs.aws.amazon.com/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であるため恐らく問題ないはず。)
AWS環境
本稿では以下の環境で検証しました。実際に検証する際には、適宜読み替えてください。
- 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))
- Front:
- 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
- Cluster
- 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
- Cluster:
- 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
- Aurora PostgreSQL 14用
検証手順/結果詳細
1.VPC(Subnets, Route tables, NAT Gateway)、IAM Roleを作成する
まず、作業用のVPCやSubnetを作ります。下記のCloudFormation template(以下、CFn tempalte)を利用します。
このCFn templateは、実行されたRegionで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 stackの作成
AWS CLIからCloudFormation stackを作ります。自身の環境にあわせて各種パラメータを指定し実行します。
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))
- Front:
- SecurityGroup:
- sg-0480929271b0af727 (default)
- sg-0c8e3d416b9303d4d (dev1-Internal)
- sg-076a174054d90bf21 (dev1-Maintainer)
1-2.IAM Roleの作成
後にGlue Connectionをテストする際に必要となります。
AWS Management Consoleから以下の設定で作成します。
- 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"
}
]
}
2.Aurora PostgreSQLのClusterの作成
2-1.DB subnet groupの作成
Aurora/RDSのインスタンスを配置するためのDB subnet groupを作ります。CloudFormationで作成した、以下のDatastore subnetを指定して作成します。
- 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
2-2.Aurora PostgreSQL 14のClusterの作成
Aurora PostgreSQL 14用のDB Clusterを作成します。
上記で作成したDB Subnet Groupを指定します。
Security Groupは下記のみを指定します。
Auroraインスタンスに接続するのは、後に構築する踏み台サーバ、Glue connectionのみであり、いずれも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
2-3.Aurora PostgreSQL 13のClusterの作成
Aurora PostgreSQL 13用のDB Clusterを作成します。
--engine 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インスタンスにテスト用データベースを作成する
3-1.鍵ペア・踏み台サーバの作成
踏み台サーバをBastion subnetに作成します。
まず、鍵ペアを作ります。 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 create-key-pair
の出力から、秘密鍵を切り出してファイルに保存しておきます。
$ cat key-pair-looking-into-glue-connections.json | jq -r .KeyMaterial > key-pair-looking-into-glue-connections.pem
次にEC2インスタンスを作成します。Public IPを付与するよう指定します。
AMIはAmazon Linux 2 x86_64の最新版を利用します。
2023/2/4現在、Oregon(us-west-2)では以下のAMI IDですが、時期やリージョンによって違いがあるので、実際のIDは必要に応じて確認してください。
Amazon Linux 2 Kernel 5.10 AMI 2.0.20230119.1 x86_64 HVM gp2
ami-06e85d4c3149db26a
SubnetやSecurity Groupは、CloudFormation stackで作成したものを指定します。
- 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インスタンス作成後、Instance ID、Public IPを確認できるのでこれを控えておきます。
- Instance ID: i-0337058a6b2cb1092
3-2.踏み台サーバへのpsqlコマンドのインストール
上記で作成した踏み台サーバにSSHログイン後、以下のように実行してpsqlコマンドをインストールします。
PostgreSQL 14のクライアントでないと、後の動作確認が出来ないので注意してください。
$ sudo amazon-linux-extras install -y postgresql14
$ psql --version
psql (PostgreSQL) 14.3
3-3.Aurora PostgreSQL 14のInstance作成・接続確認
Aurora PostgreSQL 14のCluster内に新たにInstanceを作成します。
$ 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
作成後、踏み台サーバから接続します。
接続先ホスト名はCluster作成時に確認したもの、パスワードはCluster作成時に指定したものを利用します。
$ 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=>
接続後、適当なテーブルを作成、レコードをINSERTし、通常の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');
3-4.Aurora PostgreSQL 13のInstance作成・接続確認
Aurora PostgreSQL 13のCluster内に新たにinstanceを作成します。
$ 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
作成後、踏み台サーバから接続します。
接続先ホスト名はCluster作成時に確認したもの、パスワードはCluster作成時に指定したものを利用します。
$ 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=>
接続後、適当なテーブルを作成、レコードをINSERTし、通常の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.Glue Connectionの作成とテスト
4-1.Glue connectionの仕様・注意点
2023/2/4現在、AWS Management Console上、AWS Glue関連のコンソールが幾つかに分かれている状況です。
大きく、以下の3つのコンソールがあり、必要に応じて使い分けが必要な感じです。
一部、新しいAWS Glueコンソールではまだ利用できない機能があり、それらは「AWS Glue(legacy)」から利用する感じになります。
Glue Connectionの接続テストもその一つです。
Testing an AWS Glue connection
https://docs.aws.amazon.com/glue/latest/dg/console-test-connections.html
Note
To test a connection, you must use the Connections (legacy) page in the AWS Glue console. AWS Glue Studio does not currently support testing a connection.
4-2.Aurora PostgreSQL 14への接続(接続テストは失敗する)
AWS Management Consoleの、AWS Glueコンソールから作業します。
Glue Connectionの作成のURLは、現時点においてはAWS Glue Studio上に存在します。
以下のURLから、Glue Connectionを作成していきます。
具体的には、以下のパラメータを指定して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: **********
- JDBC URL:
- Network options:
- VPC: vpc-00853f493d61474b4
- Subnet: subnet-0de78a29ad83376cf (dev1-Private(AZ1))
- Security groups:
- sg-0c8e3d416b9303d4d (dev1-Internal)
- sg-0480929271b0af727 (default)
Glue Connection作成後、テストを実施します。
現時点では、AWS Glue StudioおよびAWS Glue Console上にはテストする機能はありません。
AWS Glue Console (legacy)からテストを実施します。
当該のGlue Connectionをチェックし、「Test connection」ボタンを押します。
テストの際には、Glueが利用するためのIAM Roleが必要となるので、これを指定します。
暫く待つと、テスト結果が表示されます。Aurora PostgreSQL 14に対する接続テストは失敗します。
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
4-3.Aurora PostgreSQL 13への接続(接続テストは成功する)
AWS Management Consoleの、AWS Glueコンソールから作業します。
Glue Connectionの作成のURLは、現時点においてはAWS Glue Studio上に存在します。
以下のURLから、Glue Connectionを作成していきます。
具体的には、以下のパラメータを指定して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: **********
- JDBC URL:
- Network options:
- VPC: vpc-00853f493d61474b4
- Subnet: subnet-0de78a29ad83376cf (dev1-Private(AZ1))
- Security groups:
- sg-0c8e3d416b9303d4d (dev1-Internal)
- sg-0480929271b0af727 (default)
Glue Connection作成後、テストを実施します。
現時点では、AWS Glue StudioおよびAWS Glue Console上にはテストする機能はありません。
AWS Glue Console (legacy)からテストを実施します。
当該のGlue Connectionをチェックし、「Test connection」ボタンを押します。
当該のGlue Connectionをチェックし、「Test connection」ボタンを押します。
テストの際には、Glueが利用するためのIAM Roleが必要となるので、これを指定します。
暫く待つと、テスト結果が表示されます。Aurora PostgreSQL 13に対するテストは成功します。
CloudWatch Logs上、Glueのログが出力されます。
以下のように、接続が成功した旨のメッセージが出力されています。
なお、接続テストが成功した場合、AWS Glue Console(legacy)上にはリンクが表示されないので、AWS Management Consoleを自分でたどっていく必要があります。
JDBC Connection successful to jdbc:postgresql://examining-aurora-postgresql-13.cluster-abcdefghijkl.us-west-2.rds.amazonaws.com:5432/postgres
5.リソース削除
5-1.踏み台サーバの削除
AWS CLIからEC2インスタンスを削除します。
$ aws --profile <your AWS CLI profile> ec2 terminate-instances \
--instance-ids i-0337058a6b2cb1092
5-2.Glue Connection削除
AWS Management Consoleから削除します。
「connection aurora-postgresql-14」を削除します。
「connection aurora-postgresql-13」を削除します。
5-3.Aurora PostgreSQL 14 Cluster/Instance削除
AWS CLIからAurora Cluster/Instanceを削除します。
まず、Instanceを削除し、その後Clusterを削除します。
$ 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 Cluster/Instance削除
AWS CLIからAurora Cluster/Instanceを削除します。
まず、Instanceを削除し、その後Clusterを削除します。
$ 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等削除
CloudFormation stackを削除し、VPC関連リソースをすべて削除します。
Gitリポジトリをcloneしたディレクトリに移動後、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からの接続テストに失敗する事象についてまとめました。
当該事象の原因や解決策については、別途調査を進め、記事にしたいと思います。