Amazon Web Services ブログ

VPC Lattice のご紹介 – サービス間通信のためにネットワーキングを簡素化する (プレビュー)

最新のアプリケーションは、モジュール式の分散型コンポーネントを使用して構築されています。各コンポーネントは、独自の機能サブセットを実装するサービスです。これらのサービスが相互に通信できるようにするには、各サービスによる他のサービスの検出、アクセスの承認、およびトラフィックのルーティングを可能にする方法が必要です。問題をトラブルシューティングする際には、通信設定を制御して、アプリケーション、サービス、ネットワークの各レベルで何が起こっているかを迅速に把握できるようにする必要があります。これを実現するには、かなりの時間がかかる場合があります。

11 月 29 日より、プレビュー版の Amazon VPC Lattice が利用可能となります。これは Amazon Virtual Private Cloud (Amazon VPC) の新機能であり、サービス間の通信の接続、保護、モニタリングを一貫して行うことを可能にします。VPC Lattice では、トラフィック管理、ネットワークアクセス、モニタリングに関するポリシーを定義できるため、AWS コンピューティングサービス (インスタンス、コンテナ、サーバーレス機能) 全体でアプリケーションを簡単かつ一貫した方法で接続できます。VPC Lattice は、VPC とアカウント間のネットワーク接続と、IPv4、IPv6、および重複する IP アドレス間のネットワークアドレス変換を自動的に処理します。VPC Lattice は AWS Identity and Access Management (IAM) と統合するため、お客様独自のサービス間通信のために、現在 AWS のサービスを利用するときに慣れ親しんでいるのと同じ認証および承認機能を提供します。VPC Lattice では、ブルー/グリーンおよび canary スタイルのデプロイ向けに、リクエストの特性と加重ルーティングに基づいてトラフィックをルーティングするための共通のコントロールを使用できます。例えば、VPC Lattice では、特定のサービスのためにコンピューティングタイプを混在させることができるため、モノリシックなアプリケーションアーキテクチャをマイクロサービスにモダナイズするのに役立ちます。

VPC Lattice は非侵襲的に設計されているため、組織全体のチームが時間の経過に合わせて段階的にオプトインできます。このように、サービス間のネットワーク、セキュリティ、モニタリングの要件を VPC Lattice に処理させつつ、お客様はアプリケーションロジックに注力することで、アプリケーションをより迅速に配信できます。

Amazon VPC Lattice の仕組み
VPC Lattice では、サービスネットワークと呼ばれる論理的なアプリケーション層ネットワークを構築します。このネットワークは、さまざまな VPC やアカウントにわたってクライアントとサービスを接続し、ネットワークの複雑さを軽減します。サービスネットワークは、サービスの検出と接続を自動的に実装したり、アクセスポリシーやオブザーバビリティポリシーをサービスのコレクションに適用したりするために使用される論理的な境界です。VPC 内で HTTP/HTTPS および gRPC プロトコルを介したアプリケーション間接続を提供します。

サービスネットワークで VPC を有効にすると、VPC 内のクライアントは DNS 経由でサービスネットワーク内のサービスを自動的に検出できるようになり、すべてのアプリケーション間トラフィックは VPC Lattice 経由でルーティングされます。AWS Resource Access Manager (RAM) を使用して、VPC Lattice 経由で通信を確立できるアカウント、VPC、およびアプリケーションを制御できます。

サービスは、特定のタスクまたは機能を提供する、独立してデプロイ可能なソフトウェアのユニットです。VPC Lattice では、サービスは任意の VPC またはアカウントに配置でき、さまざまなコンピューティングタイプ (仮想マシン、コンテナ、サーバーレス機能) で実行できる論理的なコンポーネントです。サービス設定は次で構成されます。

  • サービスがトラフィックを想定しているポートとプロトコルを定義する 1 つまたは 2 つのリスナー。サポートされているプロトコルは HTTP/1.1、HTTP/2、gRPC で、TLS 対応サービス用の HTTPS も含まれます。
  • リスナーには、ルールを処理する順序を指定する優先順位、ルールを適用する場合を定義する 1 つ以上の条件、ターゲットグループにトラフィックを転送するアクションで構成されるルールがあります。各リスナーにはデフォルトルールがあり、追加のルールが設定されていない場合、または条件が満たされていない場合に有効になります。
  • ターゲットグループは、ルーティングしようとしている特定のワークロードを実行しているターゲット (あるいはコンピューティングリソース) をまとめたものです。ターゲットは、Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、IP アドレス、および Lambda 関数である場合があります。Kubernetes ワークロードの場合、VPC Lattice は AWS Gateway Controller for Kubernetes を介してサービスとポッドをターゲットにすることができます。AWS Gateway Controller for Kubernetes にアクセスするために、プレビューにご参加いただけます

VPC Lattice の論理アーキテクチャ。

サービスアクセスコントロールを設定するには、アクセスポリシーを使用できます。アクセスポリシーは、サービスネットワークおよび個々のサービスに関連付けることができる IAM リソースポリシーです。アクセスポリシーを使用する際に、「PARC」(プリンシパル、アクション、リソース、条件) モデルを使用して、サービスのコンテキスト固有のアクセスコントロールを適用できます。例えば、アクセスポリシーを使用して、所有するサービスにアクセスできるサービスを定義できます。AWS Organizations を使用する場合は、特定の組織のみがサービスネットワークにアクセスできるように制限できます。

VPC Lattice はサービスディレクトリも提供します。これは、ユーザーが所有しているサービスや、AWS RAM を介して共有されているサービスの一元的なビューです。

Amazon VPC Lattice の使用
当社では、VPC Lattice がさまざまな役割の人々の役に立つことを期待しています。例:

  • サービスネットワーク管理者は次を実行できます。
    • サービスネットワークを作成および管理すること。
    • サービスネットワークのアクセスとモニタリングを定義すること。
    • クライアントとサービスの関連付けること。
    • サービスネットワークを他の AWS アカウントと共有すること。
  • サービスオーナーは次を実行できます。
    • アクセスやモニタリングを含むサービスを作成および管理すること。
    • ルーティングを定義すること。例えば、サービスが実行されているターゲットグループをポイントするリスナーやルールを設定します。
    • サービスをサービスネットワークに関連付けること。

ここからは、実際にどのように機能するのかを見ていきましょう。この簡単なチュートリアルでは、両方の役割について説明します。

2 つのバックエンドサービスの作成
このセクションには VPC Lattice 固有の内容は含まれていません。ここでは、Amazon EC2 で実行されるサービスと AWS Lambda で実行されるサービスを作成しているだけです。これらのサービスは、後で VPC Lattice を使用してネットワークを設定するときに使用します。

Amazon Linux EC2 インスタンスで、HTTP リクエストに対して「Hello from the instance」(インスタンスからこんにちは) と応答するウェブアプリを作成します。クライアントからインスタンスへの VPC Lattice 経由のアクセスを許可するために、VPC Lattice の AWS マネージドプレフィックスリストから、ポート 8080 で TCP トラフィックを許可するインバウンドルールをセキュリティグループに追加します。

app.py を示します。このアプリでは PythonFlask を使用していますが、この記事を理解するためにお客様がそれらを知る必要はありません。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
  return 'Hello from the instance'

@app.route('/<path>')
def somePath(path):
  return 'Hello from the instance at path "{}"'.format(path)

app.run(host='0.0.0.0', port=8080)

Python の依存関係を含む requirements.txt ファイルを次に示します。必要なモジュールは flask だけなので、ここには 1 行しかありません。

flask

依存関係をインストールします。

pip3 install -r requirements.txt

その後、インスタンスからログアウトした場合に備えて、nohup コマンドを使用してウェブアプリを起動し、実行を続けます。

nohup flask run --host=0.0.0.0 --port 8080 &

EC2 インスタンスで、ウェブサービスはポート 8080 で HTTP トラフィックをリッスンするようになりました。

Lambda コンソールでは、Node.js 18.x ランタイムを使用して、すべての呼び出しに対して「Hello from the function」(関数からこんにちは) と応答する簡単な関数を作成します。

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from the function'),
    };
    return response;
};

これで 2 つのサービスは両方とも準備完了です。それでは、VPC Lattice を使用してネットワークを設定してみましょう。

VPC Lattice のターゲットグループの作成
まず、2 つのターゲットグループを作成します。1 つは EC2 インスタンス用、もう 1 つは Lambda 関数用です。VPC コンソールのナビゲーションペインに新しい [VPC Lattice] セクションがあります。そこで、[Target groups] (ターゲットグループ) を選択し、[Create target group] (ターゲットグループを作成) を選択します。

最初のターゲットグループで、[Instances] (インスタンス) のターゲットタイプを選択して名前を入力します。

コンソールのスクリーンショット。

インスタンスで実行されているウェブアプリが使用するプロトコル ([HTTP]) とポート ([8080]) を選択します。インスタンスが実行されている VPC とプロトコルバージョン ([HTTP1]) を選択します。

コンソールのスクリーンショット。

これで、ターゲットステータスのテストに使用されるヘルスチェックを設定できます。ここでは、コンソールが提案するデフォルト値を使用します。

コンソールのスクリーンショット。

次のステップでは、ターゲットを登録できます。ウェブアプリが実行されているインスタンスをリストから選択し、それを含めることを選択します。

コンソールのスクリーンショット。

選択したターゲット (ここでは 1 つのインスタンス) を確認し、[Submit] (送信) を選択します。

同じように、Lambda 関数用にターゲットグループを作成します。今回は、リストから関数を選択します。使用する関数バージョンまたは関数エイリアスを選択できます。わかりやすくするために、$LATEST バージョンを使用します。

コンソールのスクリーンショット。

VPC Lattice サービスの作成
ターゲットグループの準備が整ったので、ナビゲーションペインで [Services] (サービス) を選択し、[Create service] (サービスを作成) を選択します。名前と説明を入力します。

コンソールのスクリーンショット。

これで、認証タイプを選択できます。[None] (なし) を選択すると、サービスネットワークはクライアントアクセスを認証または承認せず、認証ポリシー (存在する場合) は使用されません。ここでは [AWS IAM] を選択し、その後 [Apply policy template] (ポリシーテンプレートを適用) ドロップダウンから、認証されたアクセスと認証されていないアクセスの両方を許可するテンプレートを選択します。

コンソールのスクリーンショット。

[Monitoring] (モニタリング) セクションで、[Access logs] (アクセスログ) をオンにします。アクセスログの宛先として、以前に作成した Amazon CloudWatch ロググループを使用しています。また、Amazon Simple Storage Service (Amazon S3) バケットまたは Amazon Kinesis Data Firehose 配信ストリームを使用するオプションもあります。

コンソールのスクリーンショット。

次のステップでは、サービスのルーティングを定義します。[Add listener] (リスナーを追加) を選択します。プロトコルについては、[HTTPS] を使用してリッスンするようにサービスを設定します。デフォルトのアクションでは、リクエストの 3 分の 2 ([Weight] (重み) [20]) をインスタンスのターゲットグループに、3 分の 1 ([Weight] (重み) [10]) を関数のターゲットグループに送信することを選択します。

コンソールのスクリーンショット。

その後、さらに 2 つのルールを追加します。最初のルール ([Priority] (優先度) [10]) は、パスが /to-instance であるすべてのリクエストをインスタンスのターゲットグループに送信します。

コンソールのスクリーンショット。

2 番目のルール ([Priority] (優先度) [20]) は、パスが /to-function であるすべてのトラフィックを関数のターゲットグループに送信します。

コンソールのスクリーンショット。

次のステップでは、サービスを 1 つ以上のサービスネットワークに関連付けるように求められます。サービスネットワークをまだ作成していないので、ここではこのステップを省略して [Next] (次へ) を選択します。設定を確認して、タスクを作成します。

VPC Lattice のサービスネットワークの作成
次に、使用する VPC とサービスを関連付けることができるように、サービスネットワークを作成します。ナビゲーションペインから [Service network] (サービスネットワーク) を選択し、[Create service network] (サービスネットワークを作成) を選択します。サービスネットワークの名前と説明を入力します。

コンソールのスクリーンショット。

[Associate services] (サービスを関連付ける) で、作成したサービスを選択します。

コンソールのスクリーンショット。

[VPC associations] (VPC の関連付け) で、ウェブアプリを実行するインスタンスが使用する VPC を選択します。これにより、ウェブアプリはサービスネットワークに関連付けられている他のサービスを呼び出すことができるようになるため、将来的に役立つ場合があります。

コンソールのスクリーンショット。

その後、いくつかのテストの実行に使用したい別の EC2 インスタンスがある 2 つ目の VPC を選択します。

コンソールのスクリーンショット。

わかりやすくするために、[Access] (アクセス) セクションでは [None] (なし) の認証タイプを選択します。

コンソールのスクリーンショット。

[Monitoring] (モニタリング) セクションで、サービスネットワーク全体のアクセスログを S3 バケットに送信することを選択します。

コンソールのスクリーンショット。

設定の概要を確認して、サービスネットワークを作成します。数秒後、すべてのサービスと VPC の関連付けがアクティブになり、サービスの利用を開始できます。

サービスの関連付けのリストからサービスのドメイン名を書き留めます。

コンソールのスクリーンショット。

VPC Lattice を使用したサービスへのアクセスのテスト
サービスの [Routing] (ルーティング) タブで、さまざまなターゲットグループへのルーティングをリスナーがどのように処理しているかについてのわかりやすい概要を確認します。

コンソールのスクリーンショット。

その後、2 番目の VPC で EC2 インスタンスにログインし、curl を使用してサービスドメイン名を呼び出します。想定どおり、レスポンスの約 3 分の 2 はインスタンスから、3 分の 1 は関数からのものです。

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws
Hello from the instance

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws
Hello from the instance

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws
"Hello from the function"

/to-instance パスと /to-function パスを呼び出すと、追加のルールがリクエストをインスタンスと関数にそれぞれ転送します。

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws/to-instance
Hello from the instance "to-instance" path

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws/to-function
"Hello from the function"

以前に設定したアクセスログサブスクリプションを使用して、サービスへのアクセスを確認できるようになりました。

このサービスについては、CloudWatch ロググループを確認します。そこでは、サービスに関する詳細なアクセス情報を含むログストリームを確認できます。

コンソールのスクリーンショット。

サービスネットワークに関連付けられているすべてのサービスのアクセスログは S3 バケットにあります。今のところサービスは 1 つしかありませんが、今後さらに増える予定です。

コンソールのスクリーンショット。

プレビューで利用可能
Amazon VPC Lattice は、米国西部 (オレゴン) リージョンプレビュー版でご利用いただけます。

VPC Lattice は、AWS の複数のコンピューティングタイプにわたってデプロイの一貫性を提供するため、インスタンス、コンテナ、サーバーレス関数をまたいでサービスを接続できます。VPC Lattice を使用すると、ポリシーベースのルーティングや加重ターゲットなど、きめ細やかで豊富なトラフィックコントロールを適用して、ブルー/グリーンおよび canary スタイルのデプロイをサポートできます。

VPC Lattice では、リクエストタイプ、トラフィック量、エラー率、応答時間などをキャプチャする詳細なアクセスログとメトリクスを使用して、サービス間通信をモニタリングおよびトラブルシューティングできます。このブログ記事でご紹介したのは、VPC Lattice を使用してできることのほんの一部です。

Amazon VPC Lattice を使用して、サービス間通信の接続、保護、モニタリングの方法を簡素化しましょう。

原文はこちらです。