AWS APIGateway IP制限

パクリ33発目!!
久々電車乗ったら階段昇降が結構負荷だということを認識。

パクリ元

内容

ちょっと API Gateway の IP制限をやる必要性が出て来たので試したらハマったので備忘録。

リソースポリシーの作成

パクリ元1つ目、2つ目のページを参考にリソースポリシーを作成する。とりあえず該当の API のみ拒否されることを確認するために下記 IP は適当に入れてデプロイしてみる。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "arn:aws:execute-api:/*/*/restriction/*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": "100.200.100.200"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "arn:aws:execute-api/*/*/*/*"
    }
  ]
}

すると想定どおりアクセスできなくなった。

{"message": "User: anonymous is not authorized to perform: execute-api:Invoke on resource:・・・"}

当然その他の API は200で返ってくることを確認し、アクセス不可時のメッセージを変更する。

メッセージ変更


「アクセスが拒否されました 403」のテンプレート本文の箇所を {“message": “アクセスが拒否されました"} に変更、デプロイしなおす。

{"message": "アクセスが拒否されました"}

おし、問題なし。

リソースポリシー変更

そして正しい IP を入れることでアクセスが許可されることを確認する。上記 aws:SourceIp の箇所を アクセス情報【使用中のIPアドレス確認】 で調べた IP で埋め(うちの IP は動的に変わるので)、再度デプロイする。

{"message": "アクセスが拒否されました"}

うむ、アクセス不可。。なぜだ!

Allow 側にホワイトリスト方式やってみたり、順番変えてみたり何回もデプロイしなおした。ルーター再起動したり、VPN 通したりいろいろやってみた。泥臭くやってみた。スイミーは考えた。うんと考えた。

久々のハマりポイント到来。あー来たね、Mr. ドハマり、元気してたか

そんなことないと思うけど、違う IP になってるんじゃないかとか思って他の グローバル IP 確認ページとかみても問題ないし、、CloudWatch からログみても撥ねられているアクセスは載ってなくて。けど載っているログにも IP は載っていないのでパクリ元4つ目を参考にカスタムログを作ることにした。

API Gateway からステージを選択し、右側中断の「ログとトレース」編集→「カスタムのアクセスログ」ON→ログの形式に以下を入れて保存する。

{ "requestId":"$context.requestId", "ip": "$context.identity.sourceIp", "caller":"$context.identity.caller", "user":"$context.identity.user","requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod","resourcePath":"$context.resourcePath", "status":"$context.status", "errorMessage": "$context.error.message", "protocol":"$context.protocol", "responseLength":"$context.responseLength" }

すると新しいログができるようになるのでアクセス許可されている API で確認。

{
    "requestId": "*****",
    "ip": "aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa",
    "caller": "-",
    "user": "-",
    "requestTime": "25/Nov/2024:17:00:00 +0000",
    "httpMethod": "GET",
    "resourcePath": "/***/***",
    "status": "200",
    "errorMessage": "-",
    "protocol": "HTTP/1.1",
    "responseLength": "1080"
}

IP は適当なものを入れたが、、ん?、、一つ二つ、、あれ?、、コロン?、、

IPv6 かい!!!

ほんとそれだけだった。上記 IPv6 をリソースポリシーに適用して終わり。全く問題なし。

コレ引っかかる人いるんじゃないのー?俺だけか?俺のイタリアンだけか?

雑感

やになっちゃうよなーこんなのに3時間もだよ。過労で倒れるよおじさんマジで

API Gateway,AWS

Posted by ak