【AWS】Amazon EMR ~ ネットワーク周り ~

■ はじめに

Amazon EMR の ネットワーク周り(セキュリティグループ)について
学んだので、メモっておく。
(インフラ大変、、、)

目次

【1】セキュリティグループ(Security Group)
 1)Master
 2)Slave
 3)ServiceAccess
 4)その他

【1】セキュリティグループ(Security Group)

* 大きく分けて、以下が必要になる。
~~~~~~~~~
1)Master
2)Slave
3)ServiceAccess
~~~~~~~~~

* 以下の公式ドキュメントが重宝。

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-man-sec-groups.html

1)Master

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-man-sec-groups.html

の「マスターインスタンスの Amazon EMR マネージド
セキュリティグループ (プライベートサブネット)』を参照。

boto3 の APIの入力パラメータ「EmrManagedMasterSecurityGroup」がこれに当たる。

a) Inbound

# ソース プロトコル ポート範囲 説明
1 Master TCP/UDP/ICMP-IPv4 All Master自身からのアクセス制御
2 Slave TCP/UDP/ICMP-IPv4 All Slaveからのアクセス制御
3 ServiceAccess TCP 8443 クラスターマネージャはマスターノードと通信可能にする

b) Outbound

# ソース プロトコル ポート範囲 説明
1 0.0.0.0/0 All All 全てOK (厳しくしたい場合は、「※ 補足1 : Outboundの制限」参照)

※ 補足1 : Outboundの制限
https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-man-sec-groups.html

より抜粋
~~~~
カスタム TCP
TCP
9443
プライベートサブネット内のサービスアクセスの
マネージドセキュリティグループのグループ ID
    
上記の「すべてのトラフィック」のデフォルトのアウトバウンドルールを削除した場合、
このルールは EMR 5.30.0 以降の最小要件になります。

注記
カスタムマネージドセキュリティグループを使用する場合、
Amazon EMR はこのルールを追加しません。
~~~~

2)Slave

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-man-sec-groups.html

の「コアインスタンスとタスクインスタンスの 
Amazon EMR マネージドセキュリティグループ (プライベートサブネット)』
を参照。

boto3 の APIの入力パラメータ「EmrManagedSlaveSecurityGroup」がこれに当たる。

a) Inbound

# ソース プロトコル ポート範囲 説明
1 Master TCP/UDP/ICMP-IPv4 All Masterからのアクセス制御
2 Slave TCP/UDP/ICMP-IPv4 All Slave自身からのアクセス制御
3 ServiceAccess TCP 8443 クラスターマネージャはコアノードおよびタスクノードと通信可能にする

b) Outbound

# ソース プロトコル ポート範囲 説明
1 0.0.0.0/0 All All 全てOK (厳しくしたい場合は、「※ 補足2 : Outboundの制限」を参照)

※ 補足2 : Outboundの制限
https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-man-sec-groups.html

の「アウトバウンドルールの編集」を参考に。
(ただし、『少なくとも、このセキュリティグループには次のアウトバウンドルールが必要ですが、
一部のアプリケーションでは追加の送信ルールが必要になる場合があります。』って記述にも注意)

3)ServiceAccess

https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-man-sec-groups.html

の「サービスアクセスの Amazon EMR マネージド
セキュリティグループ (プライベートサブネット)』を参照。

boto3 の APIの入力パラメータ「ServiceAccessSecurityGroup」がこれに当たる。

a) Inbound

# ソース プロトコル ポート範囲 説明
1 Master TCP 9443 マスターインスタンスのセキュリティグループとサービスアクセスセキュリティグループの間で通信可能

b) Outbound

# ソース プロトコル ポート範囲 説明
1 Master TCP 8443 クラスターマネージャーはマスターノードとも、コアノードおよびタスクノードともやり取り可能に
2 Slave TCP 8443 クラスターマネージャーはマスターノードとも、コアノードおよびタスクノードともやり取り可能に

4)その他

* Glue(特にData Catalog)のようなAWSサービスを使っている場合は、
 それらのエンドポイントを対応するセキュリティグループの Inbound に
 「Master」「Slave」それぞれ追加する必要がある
 => そうしないと、以下のようなエラー「Connect time out」になる

EMR内で発生した実際のエラー内容

org.apache.hadoop.hive.ql.metadata.HiveException:
com.amazonaws.SdkClientException:
Unable to execute HTTP request:
Connect to glue.us-west-1.amazonaws.com:443
[glue.us-west-1.amazonaws.com:443/XX.XX.XX.XX,
glue.us-west-1.amazonaws.com:443/XX.XX.XX.XX]
failed: connect timed out

例:Glue endpoint用のセキュリティグループの Inbound

# ソース プロトコル ポート範囲 説明
1 Master TCP 443 MasterからGlue endpointにアクセスするため
2 Slave TCP 443 SlaveからGlue endpointにアクセスするため

関連記事

Amazon EMR ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/02/20/230519
Amazon EMR ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/05/27/175610
Amazon EMR ~ boto3 編 ~
https://dk521123.hatenablog.com/entry/2020/06/24/173334
Amazon EMR ~IAM Role周り ~
https://dk521123.hatenablog.com/entry/2023/07/24/160124
EMRでINSERTを実行した際に Fail する
https://dk521123.hatenablog.com/entry/2022/05/14/001031