こんにちは、広野です。
件名の件で地味に悩んだので、書き残します。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 の統合のメニューにあります。
呼び出し元アプリ (ブラウザ) の方にも、設定したレスポンスヘッダーが返されていることが確認できました。めでたし、めでたし。
まとめ
いかがでしたでしょうか。
今回は小ネタでしたが、同じことでハマる人がいるかもしれないと思い書いておきました。
本記事が皆様のお役に立てれば幸いです。


