AWS SAMでAPI GatewayのアクセスIPを制限してみた

AWS上に作成したAPI GATEWAYに特定のIPアドレスの端末のみアクセスできるようにようにしてみました。

template.yamlを実装する時のポイントは、以下の2点です。

  1. アクセスできるIPアドレスリストを定義する。
  2. IPアドレスリストをAPI GATEWAYのリソースポリシーに設定する。

では、実装に実装しているのでコードを添付します。

  1. アクセスできるIPアドレスリストを定義する。
    Mappings→ConfigにアクセスできるIPアドレスのリスト(allowIps)を定義しています。
    AWSTemplateFormatVersion: '2010-09-09'
    Transform: AWS::Serverless-2016-10-31
    Description: >
    python3.10
    Sample SAM Template
    Globals:
      Function:
        Timeout: 900
    Parameters:
      EnvName:
        Type: String
        Default: dev
    Mappings:
     EnvName:
        dev:
          allowIps:
            - "XXX.XXX.XXX.11"
            - "XXX.XXX.XXX.12"
       stg:
          allowIps:
            - "XXX.XXX.XXX.11"
            - "XXX.XXX.XXX.12"
  2. IPアドレスリストをAPI GATEWAYのリソースポリシーに設定する。
    IPアドレスリストをAPI GATEWAYのAuth→ResourcePolicy→CustomStatements→Condition→NotIpAddressに設定します。これはEffectがDenyのポリシーに設定しているので、拒否しないIPアドレスという意味になります。
    Resources:
      RestApiGateway:
        Type: AWS::Serverless::Api
        Properties:
          Name: !Sub ${AWS::StackName}-api-gateway
          StageName: !Ref EnvName      
          Auth:
            ResourcePolicy:
              CustomStatements: [
                {
                  "Effect": "Allow",
                  "Principal": "*",
                  "Action": "execute-api:Invoke",
                  "Resource": "execute-api:/*"
                },
                {
                  "Effect": "Deny",
                  "Principal": "*",
                  "Action": "execute-api:Invoke",
                  "Resource": "execute-api:/*",
                  "Condition": {
                    "NotIpAddress": {
                      "aws:SourceIp": !FindInMap [ Config, !Ref EnvName, allowIps ]
                    }
                  }
                }
              ]
    以上となります。