😽

SAMのサーバーレスアーキテクチャで、APIGATEWAYにリソースポリシーを設定

2024/11/20に公開

はじめに

SAMを利用して、apigateway -> lambdaのサーバーレスアーキテクチャを実装しました。その際に、apigatewayへのアクセス制限としてIP制限をリソースポリシーに含めました。

ドキュメントなどを見ていたのですが、しっくりくる情報にたどり着けなかったので備忘録として残します。

SAMテンプレート

POINT:Type: AWS::Serverless::Apiを明示的にリソース追加

リソースポリシーを設定する場合には、Type: AWS::Serverless::Apiのリソースを明示的に作成する必要がある。 SAMのテンプレート記述として Type: AWS::Serverless::Function を利用した際に、Type: AWS::Serverless::Apiをリソースに作成しなくてもデフォルトで作成される仕様となっています。が、リソースポリシーを設定したい場合には明示的にリソース作成する必要がある。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  Sample SAM Template
Globals:
  Function:
    Timeout: 15
    MemorySize: 128
    LoggingConfig:
      LogFormat: JSON
  Api:
    OpenApiVersion: 3.0.3

Resources:
  Api:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Auth:
        ResourcePolicy:
          IpRangeWhitelist: !Ref WhitelistIps

  ApiFunction:
    Type: AWS::Serverless::Function
    Metadata:
      BuildMethod: makefile
    Properties:
      CodeUri: /
      Handler: bootstrap
      Runtime: provided.al2023
      Architectures:
      - x86_64
      Policies:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
        - !Ref LambdaPolicy
      Events:
        CatchAll:
          Type: Api
          Properties:
            Path: /{proxy+}
            Method: ANY
            RestApiId: 
              Ref: Api
      Environment:
        Variables:
          ENV: !Ref Env
          DB_HOST: !Ref DBHost
          DB_PORT: !Ref DBPort

Parameters:
  LambdaPolicy:
    Type: String
    Description: "lambda Policy ARN"
  Env:
    Type: String
    Description: "Environment name (e.g., local, stg, prod)"
  DBHost:
    Type: String
    Description: "Database host"
  DBPort:
    Type: Number
    Description: "Database port"
  WhitelistIps:
    Type: CommaDelimitedList
    Description: "Whitelist IP"

samconfig.toml

samconfig.tomlで関係するdeploy.parametersの部分のみ

POINT:Type:

WhitelistIpsはCommaDelimitedListの形式に合わせて。カンマの後はスペース不要

[dev.deploy.parameters]
capabilities = "CAPABILITY_IAM"
confirm_changeset = true
resolve_s3 = true

parameter_overrides = [
    "Env=dev",
    // 他を省略
    "WhitelistIps=\"XXXX/32,YYYY/32\"",
]

Discussion