#はじめに
機械学習APIを公開するため、AWS Fargateを利用しようと考えています。
なぜFargateを使うかというと、サーバーやクラスターの管理をAWSに任せることができるので、デプロイとその後の運用が非常に楽だからです。
しかし、FargateでAPIを運用する時、1点大きな問題にぶつかりました。
Fargateタスクに対して直接Elastic IPを割り当てることができないのです。
このままでは、IPアドレスが動的に変化してしまうので、機械学習APIにうまくアクセスできなくなる可能性があります。
そこで今回は、FargateとNetwork Load Balancer(NLB)を組み合わせることで、IPアドレスを固定化し、この問題を解決します。
#目次
1.アーキテクチャ
2.VPCの設計
3.Network Load Balancerの作成
4.Fargateサービスの作成
5.確認
#1.アーキテクチャ
いきなりですが、まずは今回のアーキテクチャをお見せします。
「FargateのIPアドレスを固定したい」という要望が特になければ、Fargateタスク横のElastic Network Interface(ENI)にPublic IPを割り当てて、システムを構築することも可能です。
しかし、「FargateのIPアドレスを固定したい」場合、現状のFargateはElastic IPを付与できない仕様になっているので、一工夫が必要になります。
そこで今回は、Fargateタスクと同じサブネット内にNetwork Load Balancerを追加し、そこにElastic IPを割り当てることで、問題を解決することができました!
それでは、上記アーキテクチャの構築手順についてご説明します。
#2.VPCの設計
まずはVPCを設計します。
[サービス]→[VPC]→左列の[VPC]→上部の[VPCの作成]を選択します。
「sample-vpc」という名前でVPCを作成します。
続いて、左列の[サブネット]→上部の[サブネットの作成]を選択します。
次に、インターネットゲートウェイを用意します。
左列の[インターネットゲートウェイ]→上部の[インターネットゲートウェイの作成]を選択します。
名前は「sample-gateway」としておきます。
ゲートウェイを作成するだけでは、デタッチ状態です。
これをVPCにアタッチするため、「sample-gateway」を選択し、上部の[アクション]から[VPCにアタッチ]を選択します。
ここで「sample-vpc」→[アタッチ]を選択します。
続いて、左列の[ルートテーブル]を選択すると、「sample-vpc」のルートテーブルがあります。
このチェックボックスを押した状態で、下部の[ルート]→[編集]→[別のルートを追加]で送信先とターゲットにインターネットゲートウェイの情報を追加します。
[サブネットの関連付け]に移動し、[編集]→「sample-subnet」の[関連付け]にチェック→[保存]を選択します。
以上でVPCの設計は完了です。
#3.Network Load Balancerの作成
[サービス]→[EC2]→左列の[ロードバランサー]→上部の[ロードバランサーの作成]→中央のNetwork Load Balancerの[作成]を選択します。
まずステップ1では、名前を「sample-NLB」とし、スキームは「インターネット向け」とします。
アベイラビリティ−ゾーンでは、「sample-vpc」を選択し、予め作成しておいたElastic IPを割り当てます。
ステップ2では、ルーティングの設定を行います。
「sample-targetGP」という名称で新しいターゲットグループを作成します。
また今回は、サーバーレスアーキテクチャとなるので、ターゲットの種類を「ip」としておきます。
ステップ3のターゲットの登録は、飛ばします。
まだFargateサービスを作成する前なので、機械学習APIのIPアドレスも決まっていないからです。
最後にステップ4の確認で[完了]を選択すると、Network Load Balancerの作成が完了します。
#4.Fargateサービスの作成
最後に、Fargateサービスを作成します。
AWS Elastic Container Serviceから、
①リポジトリの作成
②タスク定義の作成(タスク名:「sample-task」)
③クラスターの作成
を行います。
なお、①②の詳細な手順は、下記URLに記載されているので、こちらをご確認下さい。
https://qiita.com/oyngtmhr/items/45a0d3158e6dccb0882d
今回は、③の手順について説明します。
まず、左列の[クラスター]→上部の[クラスターの作成]を選択します。
クラスターテンプレートは「ネットワーキングのみ」とします。
名前は「sample-cluster」とし、クラスターを作成します。
作成後の画面から、[サービス]→[作成]を選択し、ステップ1のサービスの設定を行います。
ステップ2では、ネットワーク構成を決めます。
クラスターVPCには「sample-vpc」、サブネットには「sample-subnet」を設定します。
また、セキュリティーグループの設定では、[インバウンドのルール]の[ソース]にVPCのCIDRブロック「10.0.0.0/16」を記載します。
この設定により、FargateはNLBからのトラフィックのみを許可することができます。
続いて、Elastic Load Balancing(オプション)で、「Network Load Balancer」を選択し、ELBには「sample-ELB」とします。
負荷分散用のリスナーポートを設定しておきます。
ステップ3のAuto Scalingは適宜仕様に合わせて設定しますが、今回は「サービスの必要数を直接調整しない」を選択します。
最後に[サービスの作成]を選択して、Fargateサービスの作成が完了します。
#5.確認
[サービス]→[EC2]→左列の[ターゲットグループ]を選択します。
「sample-targetGP」のボックスにチェックを入れ、下部の[ターゲット]を選択すると、登録済みターゲットが記載されています。
登録済みターゲットのIPアドレスが、FargateタスクのIPアドレスと一致しており、ステータスが「healthy」となっていればOKです。
FargateタスクのENIに付与されているPrivate IPを、ターゲットとして手動で登録することも可能です。
NLBに付与したElastic IPに入力データをPOSTすると、Fargate上の機械学習APIが起動し、推論結果が返ってきます。
#おわりに
Fargateタスクに直接EIPを付与できない問題に直面しましたが、NLBを活用することで解決できました!
色んなAWSサービスを使いまくって、定期的にTipsを発信できれば良い感じですね!
こちらの記事が参考になった方は、
是非「いいね」を頂ければ幸いです!