Amazon API Gateway HTTP API に AWS CloudFormation でレスポンスヘッダーを設定する書き方

こんにちは、広野です。

件名の件で地味に悩んだので、書き残します。AWS 公式ドキュメントで明確な答えを見つけられず、生成 AI に助けてもらいました。

やりたかったこと

セキュリティ対策で、Amazon API Gateway HTTP API の特定のレスポンスヘッダーを任意の値にオーバーライドしたかったのですが、AWS CloudFormation による設定の書き方がわからず。

REST API だと以下のドキュメントに書いてあります。

 

HTTP API だと具体的な記述方法が見当たりませんでした。CloudFormation のリファレンスの方にも無く。

 

AWS CloudFormation テンプレート抜粋

結局、以下のように書くことで設定できました。インラインでコメントします。

統合 (Integration) の部分にオーバーライドしたいヘッダーの内容を書きます。

# ------------------------------------------------------------#
# API Gateway
# ------------------------------------------------------------#
  HttpApi:
    Type: AWS::ApiGatewayV2::Api
    Properties:
      Name: sample-send-function
      Description: HTTP API Gateway to send xxxxx
      ProtocolType: HTTP
      CorsConfiguration:
        AllowCredentials: false
        AllowHeaders:
          - "*"
        AllowMethods:
          - POST
          - OPTIONS
        AllowOrigins:
          - !Sub https://xxxxx.xxx
        ExposeHeaders:
          - "*"
        MaxAge: 600
      DisableExecuteApiEndpoint: false
      IpAddressType: dualstack
      Tags:
        Cost: xxxxx

  HttpApiIntegration:
    Type: AWS::ApiGatewayV2::Integration
    Properties:
      ApiId: !Ref HttpApi
      IntegrationMethod: POST
      IntegrationType: AWS_PROXY
      IntegrationUri: !GetAtt Lambda.Arn # 関連付ける Lambda 関数の ARN
      CredentialsArn: !GetAtt ApiGatewayLambdaInvocationRole.Arn # Lambda 関数を invoke するロール
      PayloadFormatVersion: 2.0
      TimeoutInMillis: 5000
      ### ここにレスポンスヘッダーを書く ###
      ResponseParameters:
        "200": # HTTP レスポンスステータスごとに書かないといけないので完璧ではない。
          ResponseParameters: # 二重に ResponseParameters が登場するが、これで正しい。
            - Destination: "append:header.X-Content-Type-Options" # Destination が変更方法とパラメータ名。
              Source: nosniff # Source が値。わかりにくい!!
            - Destination: "overwrite:header.Cache-Control"
              Source: "no-store, max-age=0"
            - Destination: "overwrite:header.Content-Security-Policy"
              Source: "frame-ancestors 'none';"
            - Destination: "overwrite:header.X-Frame-Options"
              Source: DENY
            - Destination: "overwrite:header.Strict-Transport-Security"
              Source: "max-age=31536000; includeSubDomains"

  HttpApiRoute:
    Type: AWS::ApiGatewayV2::Route
    Properties:
      ApiId: !Ref HttpApi
      RouteKey: POST /send
      Target: !Sub integrations/${HttpApiIntegration}

  HttpApiStage:
    Type: AWS::ApiGatewayV2::Stage
    Properties:
      ApiId: !Ref HttpApi
      AutoDeploy: true
      StageName: $default

注意事項

書いたコメントと重複しますが、以下、ハマり箇所でした。

  • HTTP レスポンスステータス単位で書かないといけない。エラーステータスのときも書くとなると、うーん。きちんとやろうとすると Amazon CloudFront をかぶせた方が正解なんでしょうね。
  • ResponseParameters の項目が二重に出てくるのですが、それで正しいです。気持ち悪いですが・・・。
  • Destination が変更方法とパラメータ名、Source が値、というのが非常にわかりにくいです。このネーミングではやってみないとわからないです。
  • X-Content-Type-Options ヘッダーについては、overwrite (上書き) ではなく append (追加) にしないとエラーになりました。

 

結果

AWS マネジメントコンソールで設定を確認したところ、以下のように反映されました。API の統合のメニューにあります。

 

呼び出し元アプリ (ブラウザ) の方にも、設定したレスポンスヘッダーが返されていることが確認できました。めでたし、めでたし。

 

まとめ

いかがでしたでしょうか。

今回は小ネタでしたが、同じことでハマる人がいるかもしれないと思い書いておきました。

本記事が皆様のお役に立てれば幸いです。

著者について
広野 祐司

AWS サーバーレスアーキテクチャと React を使用して社内向け e-Learning アプリ開発とコンテンツ作成に勤しんでいます。React でアプリを書き始めたら、快適すぎて他の言語には戻れなくなりました。近年は社内外への AWS 技術支援にも従事しています。AWS サービスには AWS が考える IT 設計思想が詰め込まれているので、いつも AWS を通して勉強させて頂いてまます。
取得資格:AWS 認定は15資格、IT サービスマネージャ、ITIL v3 Expert 等
2020 - 2025 Japan AWS Top Engineer 受賞
2022 - 2025 AWS Ambassador 受賞
2023 当社初代フルスタックエンジニア認定
好きなAWSサービス:AWS AppSync Events / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWSクラウド
シェアする
タイトルとURLをコピーしました