この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンバンハ、千葉(幸)です。
Amazon Redshift Serverless ワークグループを構築する際には VPC セキュリティグループを指定します。そのセキュリティグループは Redshift Serverless のノード、VPC エンドポイントに関連づけられます。
Amazon Redshift Serverless ワークグループに Redshift マネージド VPC エンドポイントを追加する場合、ワークグループ用とは別にセキュリティグループを指定します。
つまり、ここでは 2 種類のセキュリティグループが存在します。
- Amazon Redshift Serverless ワークグループ用のセキュリティグループ
- Redshift マネージド VPC エンドポイント用のセキュリティグループ
ここで、Redshift マネージド VPC エンドポイント経由のアクセスのみを考慮する場合、両者のセキュリティグループで最低限開放が必要なルールが気になってきました。
実際に試してみたのでその結果をご紹介します。
まとめ
Redshift マネージド VPC エンドポイント経由のアクセスのみを考慮する場合、
- Amazon Redshift Serverless ワークグループ用のセキュリティグループ
- インバウンドもアウトバウンドも開放は不要
- Redshift マネージド VPC エンドポイント用のセキュリティグループ
- インバウンドは要件に応じて開放が必要
- アウトバウンドの開放は不要
となっています。PrivateLink がいい感じにやってくれます。
検証する構成
以下のイメージで行います。
ここでは以下 3 つのセキュリティグループが存在します。
- ①クライアントとなる EC2 インスタンス用
- ②Redshift マネージド VPCエンドポイント用
- ③Redshift Serveless ワークグループ用
先に結論から言うと、図の通りルールを絞った状態での接続が問題なく行えました。
クライアントとなる EC2 の設定
以下の条件で EC2 インスタンスを作成しました。
- ami-0ecb2a61303230c9d(amzn2-ami-kernel-5.10-hvm-2.0.20220719.0-x86_64-gp2)
- パブリックサブネットに配置
- セッションマネージャー接続可能
割り当てたセキュリティグループはtokyo192
という名称のものです。
sh-4.2$ curl http://169.254.169.254/latest/meta-data/security-groups
tokyo192
このセキュリティグループの ID はsg-0a597e5b2a9a1d86d
(①)です。ルールの詳細はあまり関係ないので割愛します。
% aws ec2 describe-security-groups\
--filter Name=group-name,Values=tokyo192\
--query 'SecurityGroups[].GroupId'
[
"sg-0a597e5b2a9a1d86d"
]
Amazon Redshift Serverless への接続確認用に psql が使用できるようにしておきます。
sh-4.2$ sudo yum install postgresql
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Resolving Dependencies
--> Running transaction check
---> Package postgresql.x86_64 0:9.2.24-6.amzn2 will be installed
--> Processing Dependency: postgresql-libs(x86-64) = 9.2.24-6.amzn2 for package: postgresql-9.2.24-6.amzn2.x86_64
--> Processing Dependency: libpq.so.5()(64bit) for package: postgresql-9.2.24-6.amzn2.x86_64
--> Running transaction check
---> Package postgresql-libs.x86_64 0:9.2.24-6.amzn2 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=====================================================================================================================================================================
Package Arch Version Repository Size
=====================================================================================================================================================================
Installing:
postgresql x86_64 9.2.24-6.amzn2 amzn2-core 3.0 M
Installing for dependencies:
postgresql-libs x86_64 9.2.24-6.amzn2 amzn2-core 232 k
Transaction Summary
=====================================================================================================================================================================
Install 1 Package (+1 Dependent package)
Total download size: 3.3 M
Installed size: 17 M
Is this ok [y/d/N]: y
Downloading packages:
(1/2): postgresql-libs-9.2.24-6.amzn2.x86_64.rpm | 232 kB 00:00:00
(2/2): postgresql-9.2.24-6.amzn2.x86_64.rpm | 3.0 MB 00:00:00
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 14 MB/s | 3.3 MB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : postgresql-libs-9.2.24-6.amzn2.x86_64 1/2
Installing : postgresql-9.2.24-6.amzn2.x86_64 2/2
Verifying : postgresql-9.2.24-6.amzn2.x86_64 1/2
Verifying : postgresql-libs-9.2.24-6.amzn2.x86_64 2/2
Installed:
postgresql.x86_64 0:9.2.24-6.amzn2
Dependency Installed:
postgresql-libs.x86_64 0:9.2.24-6.amzn2
Complete!
sh-4.2$ psql --version
psql (PostgreSQL) 9.2.24
Amazon Redshift Serverless ワークグループの作成
詳細は割愛しますが、test
という名称で作成しました。
% aws redshift-serverless get-workgroup --workgroup-name test --output table
------------------------------------------------------------------------------------------------------------------------------------
| GetWorkgroup |
+----------------------------------------------------------------------------------------------------------------------------------+
|| workgroup ||
|+--------------------+-----------------------------------------------------------------------------------------------------------+|
|| baseCapacity | 128 ||
|| creationDate | 2022-08-22T12:25:09.790000+00:00 ||
|| enhancedVpcRouting| False ||
|| namespaceName | default ||
|| publiclyAccessible| False ||
|| status | AVAILABLE ||
|| workgroupArn | arn:aws:redshift-serverless:ap-northeast-1:012345678910:workgroup/cb9ed909-aa76-4560-aa16-6a450f6c22db ||
|| workgroupId | cb9ed909-aa76-4560-aa16-6a450f6c22db ||
|| workgroupName | test ||
|+--------------------+-----------------------------------------------------------------------------------------------------------+|
||| configParameters |||
||+--------------------------------------------------------------------------------+---------------------------------------------+||
||| parameterKey | parameterValue |||
||+--------------------------------------------------------------------------------+---------------------------------------------+||
||| datestyle | ISO, MDY |||
||| enable_user_activity_logging | true |||
||| query_group | default |||
||| search_path | $user, public |||
||| max_query_execution_time | 14400 |||
||+--------------------------------------------------------------------------------+---------------------------------------------+||
||| endpoint |||
||+---------------+--------------------------------------------------------------------------------------------------------------+||
||| address | test.012345678910.ap-northeast-1.redshift-serverless.amazonaws.com |||
||| port | 5439 |||
||+---------------+--------------------------------------------------------------------------------------------------------------+||
|||| vpcEndpoints ||||
|||+------------------------------------------------+---------------------------------------------------------------------------+|||
|||| vpcEndpointId | vpce-0a88c4713687aadae ||||
|||| vpcId | vpc-0903631bbdee7fca5 ||||
|||+------------------------------------------------+---------------------------------------------------------------------------+|||
||||| networkInterfaces |||||
||||+-----------------------------------------------------+--------------------------------------------------------------------+||||
||||| availabilityZone | ap-northeast-1a |||||
||||| networkInterfaceId | eni-00a209e6f9745388b |||||
||||| privateIpAddress | 172.31.34.60 |||||
||||| subnetId | subnet-0726628d2fcd30fd8 |||||
||||+-----------------------------------------------------+--------------------------------------------------------------------+||||
||| securityGroupIds |||
||+------------------------------------------------------------------------------------------------------------------------------+||
||| sg-0f15486646727ea74 |||
||+------------------------------------------------------------------------------------------------------------------------------+||
||| subnetIds |||
||+------------------------------------------------------------------------------------------------------------------------------+||
||| subnet-0726628d2fcd30fd8 |||
||| subnet-0d43b308c45e508d8 |||
||| subnet-0dfdc2a8a75f41548 |||
||+------------------------------------------------------------------------------------------------------------------------------+||
補足しておくと、この結果で得られたvpcEndpointId
は Redshift マネージド VPC エンドポイントとは関係ありません。
ワークグループ用のセキュリティグループはsg-0f15486646727ea74
(③)が設定されており、これは以下に関連づけられます。
- VPC エンドポイント(マネージドでなく
vpcEndpointId
で表されるもの) - Redshift Serverless 用の ENI
③のセキュリティグループのルールを確認すると結果が得られず、ルール設定がないことが確認できます。
% aws ec2 describe-security-group-rules\
--filters Name=group-id,Values=sg-0f15486646727ea74\
--output table
----------------------------
|DescribeSecurityGroupRules|
+--------------------------+
Redshift マネージド VPCエンドポイントの作成
上記の Redsift Serverless ワークグループに Redshift マネージドVPCエンドポイント を追加します。
ワークグループの詳細画面下部に項目がありますので、「エンドポイントを作成」を押下します。
各種パラメータを設定します。AWS アカウントをまたいでの配置も可能ですが、今回は同一 AWS アカウントの別 VPC を指定します。
↑予め作成済みのセキュリティグループsg-0a7cb89a146e0191f
(②)を指定して作成しました。
数分程度でエンドポイントの作成が完了します。指定したセキュリティグループ②が関連づけられていることも分かります。
②の内訳を確認すると、ひとつだけインバウンドルール(IsEgress:False
)が設定されていることが分かります。
% aws ec2 describe-security-group-rules\
--filters Name=group-id,Values=sg-0a7cb89a146e0191f\
--output table
----------------------------------------------------
| DescribeSecurityGroupRules |
+--------------------------------------------------+
|| SecurityGroupRules ||
|+----------------------+-------------------------+|
|| FromPort | 5439 ||
|| GroupId | sg-0a7cb89a146e0191f ||
|| GroupOwnerId | 012345678910 ||
|| IpProtocol | tcp ||
|| IsEgress | False ||
|| SecurityGroupRuleId | sgr-09020f977386e448d ||
|| ToPort | 5439 ||
|+----------------------+-------------------------+|
||| ReferencedGroupInfo |||
||+-------------+--------------------------------+||
||| GroupId | sg-0a597e5b2a9a1d86d |||
||| UserId | 012345678910 |||
||+-------------+--------------------------------+||
sg-0a597e5b2a9a1d86d
(①)からの 5439/tcp を許可している、というルールです。
クライアントから Amazon Redshift Serverless への接続
準備が整ったので、クライアントの EC2 から Amazon Redshift Serverless への接続を試みます。
接続先として指定するのは Redshift マネージドVPCエンドポイントのエンドポイント URL です。
sh-4.2$ psql -h endpoint-endpoint-pshjyhf1zuqxpkyvo6kc.012345678910.ap-northeast-1.redshift-serverless.amazonaws.com -U admin -d dev -p 5439
Password for user admin: # パスワードを入力
psql (9.2.24, server 8.0.2)
WARNING: psql version 9.2, server version 8.0.
Some psql features might not work.
SSL connection (cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
dev=#
↑ Amazon Redshift Serverless 名前空間で定義済みのデータベース、ユーザー名、パスワードを使用して接続ができています。
以下イメージでの接続が確認できました。
終わりに
Amazon Redshift Serverless へマネージド VPC エンドポイント経由でアクセスする際に開放が必要なセキュリティグループルールを確認してみました。
他の PrivateLink と同様に、エンドポイントのインバウンド開放だけで事足りました。
- Amazon Redshift Serverless ワークグループ用のセキュリティグループ(今回では③相当)
- インバウンドもアウトバウンドも開放は不要
- Redshift マネージド VPC エンドポイント用のセキュリティグループ(今回では②相当)
- インバウンドは要件に応じて開放が必要
- アウトバウンドの開放は不要
もちろん、Redshift マネージド VPC エンドポイント を経由しないアクセス(パブリックアクセスや同一 VPC からの直接アクセス)を行う場合には③相当のセキュリティグループでのインバウンド開放が必要です。また、VPC 拡張ルーティングが有効な場合、アウトバウンドも考慮が必要になります。
今回はスコープを絞っての検証でしたが、要件ごとに必要となるルールの理解の参考になれば幸いです。
以上、 チバユキ (@batchicchi) お送りしました。