リージョンAPIとプライベートAPIのアクセス制御とPostmanからの接続設定
AWS API Gatewayにおいて「リージョンAPI」と「プライベートAPI」を構築した際の、リソースポリシーによるIP制限の違いと、Postmanを使用した接続検証方法について記載します。
プライベートAPIについては、VPCE経由で、さらにVPCピアリングを介して利用する場合を想定しています。
前提環境
今回は以下の2つのAPIを作成・検証している環境を想定します。 * リージョンAPI: インターネット経由でアクセス * プライベートAPI: VPC内(またはVPCピアリング経由)からインターフェイスVPCエンドポイント経由でアクセス
リソースポリシーの違い:許可するIPの記述方法
API Gatewayではリソースポリシーを使用してアクセス元IP制限をかけますが、APIのタイプによって判定されるIPアドレスの種類と使用すべき条件キーが異なります。
リージョンAPIの場合
リージョンAPIはパブリックインターネットを経由してアクセスされます。そのため制限対象は「クライアントのグローバルIPアドレス(パブリックIP)」となります。 * 使用するキー: aws:SourceIp * 対象: クライアント側のパブリックIP ▼ ポリシー例(特定のパブリックIPのみ許可)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:ap-northeast-1:アカウントID:API ID/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": ["X.X.X.X/32"]
}
}
}
]
}
プライベートAPIの場合①
特定のVPCエンドポイントIDを使用した制限を行うことができます。 許可されたVPCエンドポイントを通ってきた通信のみを許可するため、意図しない経路を防ぐことができます。また、接続元のIPが変わる可能性を考慮することができます。 * 使用するキー: aws:SourceVpce * 対象: 特定のVPCE ▼ ポリシー例(特定のVPCエンドポイントからのアクセスのみを許可)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:ap-northeast-1:アカウントID:API ID/*",
"Condition": {
"StringEquals": {
"aws:SourceVpce": "vpce-XXXXXXXXXXXXXXXX"
}
}
}
]
}
プライベートAPIの場合②
接続元のプライベートIPを指定することも可能です。 * 使用するキー: aws:VpcSourceIp * 対象: アクセス元リソース(EC2など)のプライベートIP範囲(CIDR) ▼ ポリシー例(特定のVPC CIDRからのアクセスのみ許可)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:ap-northeast-1:アカウントID:API ID/*",
"Condition": {
"IpAddress": {
"aws:VpcSourceIp": ["X.X.X.X/16"]
}
}
}
]
}
Postmanを使った接続検証方法
それぞれのAPIに対して、Postmanからリクエストを送る際の手順です。
リージョンAPIへの接続
API GatewayのステージURLをそのまま使用します。
* Method: GET (または POSTなど)
* URL: https://[API ID].execute-api.ap-northeast-1.amazonaws.com/[ステージ]/[リソース]

プライベートAPIへの接続
プライベートAPIをVPC外(踏み台経由のプロキシ接続や、VPN/Direct Connect)から叩く場合、またはVPCエンドポイントのDNS名を使用して明示的にエンドポイントを指定する場合は、Hostヘッダーの操作が必要です。 特にVPCピアリング越しなどでプライベートDNS名の自動解決が効かない、あるいは意図的に特定のエンドポイント(VPCE)を経由させたい場合は以下の手順を行います。
手順
-
URLの構築(VPCEのDNS名を使用) 通常のAPIのエンドポイントではなく、VPCエンドポイント(VPCE)のDNS名を使用します。 https://[VPCE ID].execute-api.ap-northeast-1.vpce.amazonaws.com/[ステージ]/[リソース]
-
ヘッダーの設定(Hostヘッダー) URLをVPCEのアドレスにしてしまうと、API Gateway側は「どのAPIを呼び出せばいいか」を判断できません。そのため、ヘッダーで本来のAPI ID情報を渡す必要があります。 Postmanで以下のように設定します。
- GET: https://vpce-XXXX-XXX.execute-api.ap-northeast-1.vpce.amazonaws.com/[ステージ]/[リソース]
- Headers:
- Host: [API ID].execute-api.ap-northeast-1.amazonaws.com

また、SigV4認証については、PostmanではAPIリクエストを作成した後「Authorization」タブで「AWS Signatrue」を選択し、必要情報を入力するだけでリクエストの正規化、ハッシュ化、署名文字列の作成などを代行してくれます。 入力後、APIリクエストのHeadersに「Authorization」と「X-Amz-Date」が自動的に挿入されます。
おわり。