API GatewayプライベートAPIにアカウントをまたいでプライベートに接続してみた

API Gatewayで作成したプライベートAPIに、アカウントをまたいでプライベートに接続してみたいと思います。本エントリでは各アカウントで必要な作業を説明していきたいと思います。
2019.03.29

こんにちは、坂巻です。

API Gatewayで作成したプライベートAPIに、アカウントをまたいでプライベートに接続してみたいと思います。本エントリでは各アカウントで必要な作業を説明していきたいと思います。

構成

最終的には以下のような構成で、プライベートAPIに接続します。

00

次項記載の内容については、構成図のVPC、EC2が既に構築済みの前提となります。

VPCエンドポイント作成

接続元となる構成図のAアカウントで、VPCエンドポイントを作成します。エンドポイントのサービスcom.amazonaws.ap-northeast-1.execute-apiを選択します。併せて、VPCエンドポイントを配置するサブネット、VPCエンドポイントにアタッチするセキュリティグループを選択します。

01

VPCエンドポイントにアタッチしたセキュリティグループのルールは、HTTPS(TCP 443)で、アクセス元のセキュリティグループ(ここではAppインスタンスのセキュリティグループ)をソースとしています。

02

VPCエンドポイントが作成できたら、ステータスが「使用可能」であることを確認してください。

03

VPCエンドポイントに付与されたDNS名の詳細については、以下の記事を確認してください。

上記記事にも記載ありますが、Direct Connect経由のオンプレミスからは直接引けない点に注意が必要です。Direct Connect経由のオンプレミスから直接引く際は、Route 53 リゾルバー等の設定が必要になります。

なお、API GatewayのVPCエンドポイントは、インターフェイス VPCエンドポイントになりますので、VPCエンドポイント作成時に選択したサブネットには、ネットワークインターフェイスが作成されます。

04

API Gateway作成

Bアカウント側でAPI Gatewayを作成します。ここでは、サンプルのPetStoreを利用してAPIを作成します。プライベートAPIを作成するので「エンドポイントタイプ」では「プライベート」を選択します。

05

APIを作成後、リソースポリシーを設定します。ここでは作成したAPIに対して、接続可能なVPCエンドポイントを制限します。 06

Resourceには該当のAPIを指定しています。リージョン、アカウントID、APIのリソースID等は環境に合わせて変更してください。Conditionにて、接続を許可するVPCエンドポイントのIDを指定しています。(ここではAアカウントのVPCエンドポイントID)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:ap-northeast-1:アカウントID:6r6oaqtr37/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "vpce-03f6d2b1bb8d0f015"
                }
            }
        }
    ]
}

リソースポリシーの詳細については、以下を確認ください。

リソースポリシーを設定後、APIをデプロイします。 コンソールより「API」 - 「PetStore」 - 「リソース」を選択し、「アクション」 - 「APIのデプロイ」を選択します。「デプロイされるステージ」は「新しいステージ」で任意のステージ名(今回はv1)でデプロイします。

07

動作確認

AアカウントのAppインスタンスから、APIに接続します。

$ curl https://6r6oaqtr37.execute-api.ap-northeast-1.amazonaws.com/v1/pets/
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }

想定どおり呼び出すことができました。

リソースポリシーで接続元が制御できているのか、別のAWSアカウントから接続を試みたいと思います。別アカウントでの作業内容は割愛しますが、上記で記載したVPCエンドポイント作成と同様になります。

別アカウントにてAPIに接続します。

$ curl https://6r6oaqtr37.execute-api.ap-northeast-1.amazonaws.com/v1/pets/
{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:ap-northeast-1:********9764:6r6oaqtr37/v1/GET/pets/"}

リソースポリシーで許可していないVPCエンドポイントからの接続となりますので、接続が拒否され、想定通りの結果となりました。

さいごに

プライベートAPIだからといって、構築方法はパブリックAPIと大差なく、エンドポイントのタイプを指定し、VPCエンドポイントから接続する感じですね。アカウントまたぎについても、単一アカウントからの接続と変わらず、VPCエンドポイントにアクセスすれば接続できましたね!

参考