AWS Glue DataBrew で Redshift に接続する際の注意点

## はじめに
AWS Glue DataBrew は AWS が提供するデータプレパレーションサービスです。S3 上のデータレイク や Redshift などの JDBC 接続可能なデータベース、Snowflake 等様々なデータソースと接続可能で、250 種類以上の組み込み処理を使用してデータのクリーニングや正規化を行うことができます。

プライベートサブネット上の Redshift クラスターをデータソースとして接続する際に発生しがちなエラーやその対応について記載します。Data Brew そのものの説明や操作方法については触れません。

## 想定する構成
以下のようにプライベートサブネットに配置された Reshift クラスターに接続する場合の構成を前提としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/302723c9-abd9-0b55-47ec-9f57c3161788.png)


## プロジェクトのロードに失敗する場合のトラブルシューティング
### セキュリティグループの自己参照設定
DataBrew の接続は AWS Glue の接続と同一です。VPC 内のリソースに接続するには、接続設定により払い出された ENI にアタッチされているセキュリティグループに自己参照ルールが設定されている必要があります。設定を行っていない場合は以下のようなメッセージが発生し、DataBrew が VPC への接続に失敗します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/6f554cfd-102a-a015-c54a-335e5876c302.png)


```
Failed to connect to VPC. At least one security group must open all ingress ports. To limit traffic, 
the source security group in your inbound rule can be restricted to the same security group.
(Service: AWSGlueDataBrewJobExecutor; Status Code: 400; Error Code: InvalidInputException; Request ID: 85ec5757-efee-490d-a928-xxxxxxxxxxxx)
```

自己参照ルールとは以下のように送信元に自身のセキュリティグループが設定されているルールのことを指します。全ての TCP ポートに対する自己参照のインバウンドルールが含まれている必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/404f8f51-f5fc-6f60-7f30-459311f57c57.png)
画像は以下のドキュメントより引用

https://docs.aws.amazon.com/glue/latest/dg/setup-vpc-for-glue-access.html


### Glue エンドポイントへの接続経路
Glue のエンドポイント (`glue.<region>.amazonaws.com`) と通信する必要があるため、Redshift クラスターが配置されているプライベートサブネットには Glue のインターフェースエンドポイントまたは NAT Gateway が配置されている必要があります。(冒頭の想定する構成を参照) Glue エンドポイントへの経路が存在しない場合は以下のようなエラーが発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/b1e164d9-cc0b-3f3e-d81c-dd956ae0ae0b.png)

```
{"error":"Failure reading from input location AwsGlueDataBrew-xxxxxxxxxxxx, 
public.users: Unable to reach AWS Glue to get connection AwsGlueDataBrew-xxxxxxxxxxxx.
Exception: Connect timeout on endpoint URL: \"https://glue.ap-northeast-1.amazonaws.com/\""}
```

## 接続のセキュリティグループを変更したい
Glue コンソールで JDBC 接続を作成する場合と異なり、DataBrew のコンソールから Redshift への接続を作成する場合はセキュリティグループを指定する項目がありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/421e9ba4-27b0-4012-6b44-d1ae766895a3.png)

作成後の接続情報を確認すると自動でセキュリティグループが割り当てられていますが、選択した Redshift クラスターのセキュリティグループが割り当てられているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/54189396-4f7c-de4b-786e-f0d46c3cee5e.png)


一方で Redshift にアタッチしているセキュリティグループに自己参照ルールを追加するのではなく、以下のように設定した Glue 用のセキュリティグループを適用したいケースもあるかと思います。

* Glue 用セキュリティグループ (glue-sg) には自己参照ルールを設定

|Type|Protocol|Port range|Source|
|---|---|---|---|
|All TCP|TCP|All|sg-xxxxxxxxxxxxxxxxx / glue-sg|

* Redshift 用セキュリティグループ (redshift-sg) には Glue 用セキュリティグループからの接続許可を設定

|Type|Protocol|Port range|Source|
|---|---|---|---|
|Redshift|TCP|5439|xxx.xxx.xxx.xxx/24|
|All TCP|TCP|All|sg-xxxxxxxxxxxxxxxxx / glue-sg|


この場合は DataBrew ではなく Glue のコンソールから接続を編集することでセキュリティグループを変更できます。DataBrew で接続を作成したとしても、Glue の接続として管理されているということですね。接続の削除も Glue コンソールから実施する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/b5f11a98-78b1-8ccf-e2d7-ef366e772899.png)







以上です。
参考になれば幸いです。