AWS AppSyncでレスポンスヘッダーを追加したい！


今年は雪が多すぎて、除雪で身体が日々バキバキです。
そんな中、AWS AppSyncで開発中のAPIが指摘されました。
「除雪ばっかりしてないで、レスポンスヘッダー足りないから付けろ！」
と。

（除雪しないと車が動けない状態になるんです。）
そんなことはさておき、本題です。

脆弱性診断等、実施していくとレスポンスヘッダーが必要なことが
わかってきます。その際の解決方法を探ります。


## AWS AppSyncを探る

まずは簡単にできないか
AWS AppSyncの設定画面を眺めてみます。
（2022.2.21時点）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/f7a49ac4-394c-2348-0444-29680aa0cc88.png)

はい、レスポンスヘッダーを追加する箇所はありません。

次は、レスポンスマッピングテンプレートかな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/7fed22bb-9677-8775-baab-aaa2596ecaf9.png)

パッとわからないので、
コンテキストリファレンスを見てみます。

https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/resolver-context-reference.html

コンテキスト情報は以下になります。

```
{
   "arguments" : { ... },
   "source" : { ... },
   "result" : { ... },
   "identity" : { ... },
   "request" : { ... },
   "info": { ... }
}
```

やはり、responseがない。。。


## GitHubを探る

いました。
AWS AppSyncとして機能はなく、今後？アップデートされるのかもしれません。期待。

https://github.com/aws/aws-appsync-community/issues/122

## 解決方法を探る

GitHubにも記載がありましたが、Amazon CloudFront / Lambda@Edgeでレスポンスヘッダーを追加する方法があります。

こんなイメージですね。

![cf-lambda.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/70edeedb-f1f2-6a76-2356-cfec95e304dc.png)

最後のCloudFrontに設定したLambda@Edgeでレスポンスヘッダーを追加するパターンです。
ただ、「Lambdaのソースを管理したくないなー」と思ってしまうめんどくさがり屋です。
2021年11月頃、便利なアップデートが出ていました。Amazon CloudFront単体でレスポンスヘッダーを追加することができるのです。さすがです。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/adding-response-headers.html

これでAWSの設定だけで解決できちゃいます。
こんなイメージです。

![cf-lambda.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/926fa6ef-34fe-d0d9-ed14-3cb4919c3833.png)


## やってみる

AWS AppSyncはすでにある前提です。

まずは、Amazon CloudFrontのディストリビューションを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/33e89916-be1a-62c7-d5bb-d6bd2a34bfc4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/7b2f8276-2e5b-e0bc-d832-2ac8d0f53beb.png)

:::note warn
ご注意
オリジンドメインの選択肢にAWS AppSyncは出てきませんが、API URLを直接入力します。
:::

![貼り付けた画像_2022_02_22_0_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/3f94ea08-8d0c-bb9c-2566-7885cfc7e311.png)

TLSの設定等を行った後（項目が多いので割愛します）、「デフォルトのキャッシュビヘイビア」の「レスポンスヘッダーポリシー」を設定します。
今回は、カスタムポリシーとしますので、「ポリシーを作成」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/11c44f66-24fb-1c8b-4a6e-2a5f102da9c3.png)

ちなみに、マネージドポリシーもあるので、付与したいヘッダーがあれば活用すると良いですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/90c8dae1-8f69-8325-8ea6-9f6d94fb007e.png)

レスポンスヘッダーポリシー作成ページで名前や説明、オプションを設定します。
その後、カスタムヘッダーを設定し、作成します。今回は、「x-snow-key」というヘッダーを追加します。
セキュリティヘッダーオプションもあるので、活用していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/882d20fc-f21e-9297-5f91-104598be763b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/5c6585b3-6f4f-2918-4fa8-5d5746a3f119.png)


最後に元のページで作成したポリシーを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/244b7a84-70d1-8a6b-ffa6-27b945001b44.png)

## 確認する

設定したAmazon CloudFront経由でAWS AppSyncにアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/847cb0db-ea74-c98e-0647-774c4506ca06.png)

先ほど設定した「x-snow-key」というレスポンスヘッダーが追加されていることがわかります。
無事、成功です。

## まとめ

2022/2/21時点ではAWS AppSync内でレスポンスヘッダーを設定することができませんが、他のサービスを利用することでレスポンスヘッダーを追加することが可能です。さらにLambda@Edgeを準備することなく、CloudFrontの設定で実現できるのはありがたいですね。

同じことで悩んでいる方の少しでもお力になれれば幸いです。


※2022/3/9 追記
レスポンスヘッダーを追加できるようになったので、以下を書きました！

https://qiita.com/ta__k0/items/50fc87d23f4ef6bd4684