LoginSignup
64
59

More than 5 years have passed since last update.

AWS FargateのIPアドレスを固定化してみる

Last updated at Posted at 2018-07-20

はじめに

機械学習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.アーキテクチャ

いきなりですが、まずは今回のアーキテクチャをお見せします。

図1.png

「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を作成します。

スクリーンショット 2018-07-16 14.11.44.png

続いて、左列の[サブネット]→上部の[サブネットの作成]を選択します。

図1.png

次に、インターネットゲートウェイを用意します。
左列の[インターネットゲートウェイ]→上部の[インターネットゲートウェイの作成]を選択します。
名前は「sample-gateway」としておきます。

スクリーンショット 2018-07-16 14.33.15.png

ゲートウェイを作成するだけでは、デタッチ状態です。
これをVPCにアタッチするため、「sample-gateway」を選択し、上部の[アクション]から[VPCにアタッチ]を選択します。
ここで「sample-vpc」→[アタッチ]を選択します。

続いて、左列の[ルートテーブル]を選択すると、「sample-vpc」のルートテーブルがあります。
このチェックボックスを押した状態で、下部の[ルート]→[編集]→[別のルートを追加]で送信先とターゲットにインターネットゲートウェイの情報を追加します。

図1.png

[サブネットの関連付け]に移動し、[編集]→「sample-subnet」の[関連付け]にチェック→[保存]を選択します。
以上でVPCの設計は完了です。

3.Network Load Balancerの作成

[サービス]→[EC2]→左列の[ロードバランサー]→上部の[ロードバランサーの作成]→中央のNetwork Load Balancerの[作成]を選択します。
まずステップ1では、名前を「sample-NLB」とし、スキームは「インターネット向け」とします。

スクリーンショット 2018-07-16 14.49.25.png

アベイラビリティ−ゾーンでは、「sample-vpc」を選択し、予め作成しておいたElastic IPを割り当てます。

図1.png

ステップ2では、ルーティングの設定を行います。
「sample-targetGP」という名称で新しいターゲットグループを作成します。
また今回は、サーバーレスアーキテクチャとなるので、ターゲットの種類を「ip」としておきます。

スクリーンショット 2018-07-16 14.59.49.png

ステップ3のターゲットの登録は、飛ばします。
まだFargateサービスを作成する前なので、機械学習APIのIPアドレスも決まっていないからです。
最後にステップ4の確認で[完了]を選択すると、Network Load Balancerの作成が完了します。

4.Fargateサービスの作成

最後に、Fargateサービスを作成します。
AWS Elastic Container Serviceから、
①リポジトリの作成
②タスク定義の作成(タスク名:「sample-task」)
③クラスターの作成
を行います。
なお、①②の詳細な手順は、下記URLに記載されているので、こちらをご確認下さい。
https://qiita.com/oyngtmhr/items/45a0d3158e6dccb0882d

今回は、③の手順について説明します。
まず、左列の[クラスター]→上部の[クラスターの作成]を選択します。
クラスターテンプレートは「ネットワーキングのみ」とします。

スクリーンショット 2018-07-16 15.19.52.png

名前は「sample-cluster」とし、クラスターを作成します。
作成後の画面から、[サービス]→[作成]を選択し、ステップ1のサービスの設定を行います。

スクリーンショット 2018-07-16 15.26.05.png

ステップ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」のボックスにチェックを入れ、下部の[ターゲット]を選択すると、登録済みターゲットが記載されています。

図1.png

登録済みターゲットのIPアドレスが、FargateタスクのIPアドレスと一致しており、ステータスが「healthy」となっていればOKです。
FargateタスクのENIに付与されているPrivate IPを、ターゲットとして手動で登録することも可能です。
NLBに付与したElastic IPに入力データをPOSTすると、Fargate上の機械学習APIが起動し、推論結果が返ってきます。

おわりに

Fargateタスクに直接EIPを付与できない問題に直面しましたが、NLBを活用することで解決できました!
色んなAWSサービスを使いまくって、定期的にTipsを発信できれば良い感じですね!
こちらの記事が参考になった方は、
是非「いいね」を頂ければ幸いです!

64
59
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
59