AWS EC2環境でDataPowerのマルチキャスト通信を試してみた

# はじめに

DataPowerは、ゲートウェイ機能を提供し、社内システムを外部に安全に公開する際に使われます。その際には、社内システムを守るため、外部からの流量を制御をしたいという要件がでることがあります。DataPowerで複数台でクラスター構成する場合には、この流量制御情報をクラスター内で共有するため、[SLMピア・グループ](https://www.ibm.com/docs/ja/datapower-gateway/10.0.x?topic=policies-creating-slm-peer-group)を設定する方法があります。

SLMピア・グループの設定では、クラスター内の通信方法として、ユニキャスト、または、マルチキャストを選択することができます。しかし、AWSをはじめとしたパブリッククラウド環境では、マルチキャストなどの通信が許可されていません。ただ、AWSでは、マルチキャスト通信を使用する方法として、[AWS Transit Gateway](https://aws.amazon.com/jp/transit-gateway/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc)機能が提供されています。

この記事では、AWS Transit Gatewayを使用して、EC2 DataPowerクラスター環境でSLMピア・グループ（マルチキャスト）を実装・動作検証した内容を紹介します。

Transit Gatewayでマルチキャストを使用する場合には、構成に影響する[Considerations](https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/tgw-multicast-overview.html)がありますので、事前に確認が必要になります。


:::note warn
今回の検証では、機能の稼働を確認できましたが、この構成が製品としてサポートされるかはIBMへ確認中ですのでご注意ください。
:::


# 1 AWS EC2環境のセットアップ

## 1.1 EC2の払い出し

詳細は割愛しますが、今回は、以下のような点に注意してセットアップしています。
１つ目のEC2インスタンスはカタログAMIからセットアップする必要がありますが、２つ目のインスタンスは１つ目のEC2インスタンスのイメージを作成して複製起動することができます。

設定項目|注意点
---|---
Amazonマシンイメージ（AMI）| RHEL7のイメージを選択
インスタンスタイプ| t3.xlargeなどの[Nitroタイプ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances)を選択
ネットワーク設定| 複数のDataPower間で通信するポート（5550など）と、[マルチキャストで使用するポート](https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/how-multicast-works.html)を許可する


## 1.2 EC2 OS設定

EC2 Linuxでは、デフォルトではIGMP v3が有効化されていますが、Transit Gatewayではv2のみサポートされます。OSの設定でIGMP v2を使用するように変更します（[参考](https://sites.google.com/site/miclinuxcorner/technology/multicast-routing)）。

```
[root@ip-172-31-**-** ~]# echo "2" > /proc/sys/net/ipv4/conf/eth0/force_igmp_version

[root@ip-172-31-**-** ~]# cat  /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.conf.eth0.force_igmp_version = 2

[root@ip-172-31-**-** ~]# sysctl -p
net.ipv4.conf.eth0.force_igmp_version = 2

[root@ip-172-31-80-162 ~]# cat /proc/net/igmp
Idx     Device    : Count Querier       Group    Users Timer    Reporter
1       lo        :     3      V3
                                010101EF     1 0:00000000               0
                                020101EF     1 0:00000000               0
                                010000E0     1 0:00000000               0
2       eth0      :     2      V2
                                640000EF     1 0:00000000               1
                                010000E0     1 0:00000000               0
```

# 2 EC2へのDataPowerインストール・設定


## 2.1 DataPower for Linuxのインストール

[こちらの記事](https://qiita.com/ryota_n/items/aa4b446a208902747ae2)の手順でインストールします。
今回も、DataPower v10.0.4モジュールを使用しています。

## 2.2 DataPowerへのSLM設定

[こちらの手順](https://www.ibm.com/docs/ja/datapower-gateway/10.0.x?topic=policies-creating-slm-peer-group)を参考にSLMピア・グループを設定していきます。
以下に主要な設定箇所の画面を記載します。

### defaultドメインでのXML Management Interface有効化例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/5809cf7b-608b-633d-82e3-8ba67246496a.png)

### アプリケーション・ドメインでのPeer Group設定例

2つのEC2インスタンスのプライベートIPアドレスを設定します（2つ目のインスタンス起動後に設定します）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/701e3eb8-31f3-e47d-c845-84664d8c298c.png)

### アプリケーション・ドメインでのIPマルチキャスト設定例

グループアドレスやポートは一例ですので、お使いの環境に応じて設定してください。このグループアドレスは、後続のVPCセットアップで通信設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/4f8b74bc-938d-56d6-d75a-83f674455535.png)



以上で1つ目のEC2インスタンスの設定は完了となります。
このインスタンス・イメージからAMIを作成し、2つ目のインスタンスを起動します。


# 3 AWS VPC環境セットアップ

## 3.1 Transit Gateway設定

[こちらの手順](https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/working-with-multicast.html)にそってTransit Gateway設定を実施します。

以下はマルチキャストドメインの設定例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/68295a7c-b7bb-cf43-d030-ad94429a4182.png)

グループ・メンバーは以下のようにIGMPによって自動で追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/721041df-d4e2-7062-d813-938dbc4a9738.png)


# 4 動作確認

以上で設定は完了です。
これで2台のEC2 DataPower間で流量制御情報が同期されます。

## 4.0 テスト環境準備

DataPowerでの動作テストのため、以下のような設定を実施します。
サンプルのアプリケーション・ドメインの構成定義を[こちら](https://github.com/RyotaNarita/proxy-domain)で公開しています。

- アプリケーション・ドメイン
- マルチ・プロトコル・ゲートウェイ
- 処理ポリシー（この中でSLMピア・グループ設定を使用） 


## 4.1 API呼び出し例

1号機に流量を越えてAPIを呼び出すと429が返るようになります。
その後、2号機へAPI呼び出しを実施しても1号機での流量情報が同期されているため429が返ります。
以下は、今回の検証で設定した応答例です。

```
curl -ki https://**.**.**.**:9443/coffee/iced
HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json
Content-Language: en
X-Backside-Transport: FAIL FAIL
Connection: close

{"title":"429 Too Many Requests","status":429,"detail":"Temporarily our service limited the requests rates, please try again after a few m
inutes.","instance":"","dateTime":"","origin":"API Platform PrgOrg00 Proxy"}
```

## 4.2 SLMピア・グループ状況確認

SLMピア・グループが動作しているかはSLM Peering Statusで確認することができます。
ここまでの設定でマルチキャスト通信ができていれば、以下のようにピアとなるDataPowerが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/d20e8ac4-f067-a0e7-fbee-a08d39da6ec0.png)


以上です。