9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS API Gateway VPCリンクでプライベートコンテナにインターネットからアクセスする

Last updated at Posted at 2021-08-01

初めに

API Gateway のプライベート統合を利用して、ECS によりプライベートサブネットにデプロイされたアプリケーションにアクセスする方法について紹介します。プライベート統合は VPC 内のリソースに VPC 外からアクセスするための機能です。

API Gateway のプライベートな統合により、VPC 内にある HTTP/HTTPS リソースを VPC 外のクライアントがアクセスできるように簡単に公開できます。プライベート VPC リソースへのアクセスを VPC 境界を超えて拡張するために、プライベート統合で API を作成できます。

プライベート統合を使用するために VPC リンクという機能を使います。

VPC リンクを使用すると、Application Load Balancer または Amazon ECS コンテナベースのアプリケーションなどの、HTTP API ルートを VPC 内のプライベートリソースに接続するプライベート統合を作成できます。

なお VPC リンクを使ったプライベート統合は、ALB のスキームに内部向けを選択しないとうまくいかないようです。最初、インターネット向けでやっていましたが、エラーレスポンスが返ってきました。

以下のチュートリアルの CloudFormation のテンプレートも内部向けになっていました。

Scheme: internal

手順

1. VPC リンクを作成

「HTTP API の VPC リンク」を選択し、アプリケーションをデプロイする VPC を選択します。

1.png

サブネットとセキュリティグループを選択し、「作成」をクリックします。

2.png

2. ALB を作成

スキームは「内部」を選択します。インターネット向け ALB を作成したところ、ブラウザに

{"message": "Service Unavailable"}

と表示され、503 エラーが発生しました。ALB のトラフィックを確認したところ、リクエストが ALB まで到達していませんでした。VPC リンクを使ったプライベート統合は、内部向けしか選択できないようです。

3.png

VPC と プライベートサブネットを選択します。

4.png

ターゲットグループを作成します。種類は IP を選択します。

5.png

3. API Gateway の HTTP API を作成

HTTP API の「構築」をクリックします。

6.png

API 名を入力し、「次へ」をクリックします。

7.png

「次へ」をクリックします。

8.png

「次へ」をクリックします。

9.png

「作成」をクリックします。

10.png

ルートを作成します。「Create」をクリックします。

11.png

パスには「/{proxy+}」と入力し、「作成」をクリックします。

12.png

プライベート統合を作成します。「統合をアタッチする」をクリックします。

13.png

「統合を作成してアタッチ」をクリックします。

14.png

統合タイプは「プライベートリソース」を選択します。

15.png

以下のように ALB とリスナーを選択します。

16.png

VPC リンクを選択し、「作成」をクリックします。

17.png

4. エンドポイントを作成

以下のエンドポイントを 4 つ作成します。インターフェース型はすべてプライベート DNS 名を有効化します。

18.png

5. Fargate でアプリケーションをデプロイ

サービスを作成します。VPC とプライベートサブネット、セキュリティグループを選択します。パブリック IP の自動割り当ては「DISABLED」を選択します。

19.png

ALB を選択します。後はデフォルトの設定で進めます。

20.png

デプロイが完了しタスクが RUNNING になったら、API の呼び出し URL をブラウザに貼り付けます。

21.png

インターネットからプライベートコンテナにアクセスできました。

22.png

注意

以下は検証していませんが、定期的にリクエストを送って防ぎたいです。

VPC リンク経由で 60 日間トラフィックが送信されない場合は、INACTIVE になります。VPC リンクが INACTIVE 状態の場合、API Gateway は VPC リンクのネットワークインターフェイスをすべて削除します。これにより、VPC リンクに依存する API リクエストが失敗します。API リクエストが再開すると、API Gateway はネットワークインターフェイスを再プロビジョニングします。ネットワークインターフェイスを作成し、VPC リンクを再度アクティブ化するには、数分かかることがあります。VPC リンクステータスを使用して、VPC リンクの状態を監視できます。

ALB のスキーム

インターネット向けと内部向けの違いについて簡単にまとめます。

インターネット向け

  • インターネット向けロードバランサーのノードにはパブリック IP アドレスが必要
  • インターネット向けロードバランサーの DNS 名は、ノードのパブリック IP アドレスにパブリックに解決可能
  • インターネット向けロードバランサーは、クライアントからインターネット経由でリクエストをルーティングする

内部向け

  • 内部ロードバランサーのノードはプライベート IP アドレスのみを持つ
  • 内部ロードバランサーの DNS 名は、ノードのプライベート IP アドレスにパブリックに解決可能
  • 内部向けロードバランサーは、ロードバランサー用に VPC へのアクセス権を持つクライアントからのみ、リクエストをルーティングする

共通点

  • インターネット向けロードバランサーと内部向けロードバランサーは、どちらもプライベート IP アドレスを使用してリクエストをターゲットにルーティングする

確かにパブリックサブネットでコンテナを起動したとき、ノードの IP アドレスがプライベート IP だったのが不思議でした。

参考記事

9
1
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
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?