Amazon Redshift Serverless にマネージド VPC エンドポイント経由でアクセスでする際にワークグループ側のインバウンド許可は必要ない

Amazon Redshift マネージド VPC エンドポイントを通じたアクセスは PrivateLink によって実現されるため、エンドポイントのインバウンドだけを考慮してあげれば大丈夫です。

コンバンハ、千葉(幸)です。

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エンドポイント を追加します。

ワークグループの詳細画面下部に項目がありますので、「エンドポイントを作成」を押下します。

Redshift_managed_endopoint

各種パラメータを設定します。AWS アカウントをまたいでの配置も可能ですが、今回は同一 AWS アカウントの別 VPC を指定します。

Redshift_managed_vpc_endpoint

↑予め作成済みのセキュリティグループsg-0a7cb89a146e0191f(②)を指定して作成しました。

数分程度でエンドポイントの作成が完了します。指定したセキュリティグループ②が関連づけられていることも分かります。

Redshift

②の内訳を確認すると、ひとつだけインバウンドルール(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) お送りしました。

参考