🧏‍♂️

CloudFrontとAPI Gatewayを統合してセキュアなAPIを実現する方法

2024/04/01に公開

はじめに

既にCloudFront、API Gatewayの作成、設定は終わっていることとして進めます。

それぞれの詳しい設定は下記の記事を参考にしてください。
https://zenn.dev/nenenemo/articles/a3a4b29af76df2#cloudfrontの作成
https://zenn.dev/nenenemo/articles/2bc89610464324

CloudfrontとAPI Gatewayを統合するメリット

パフォーマンスの向上

CloudFrontはグローバルに分散されたエッジロケーションを通じてコンテンツをキャッシュし、エンドユーザーにより近い場所からAPIレスポンスを提供することができます(CDN)。これにより、レイテンシーが大幅に削減され、APIの応答速度が向上します。
https://www.cloudflare.com/ja-jp/learning/cdn/what-is-a-cdn/

セキュリティの向上

既にCloudFrontにWAFが設定されている場合は、API Gatewayと統合するとAPIレスポンスもCloudFrontを通じて配信されるようになります。つまり、API Gatewayに直接WAFを設定する必要はなく、自動的にWAFのフィルタリングを受けることができるので、セキュリティが向上します。

コスト削減

CloudFrontを介してAPI Gatewayのトラフィックを処理することで、エッジロケーションでのキャッシング効果を活用でき、バックエンドへのリクエスト数が減少します。これにより、API Gatewayとバックエンドのリソース使用量が削減され、コスト削減に繋がります。

API Gatewayをデプロイする

今回はステージ名をapiとしてデプロイしました。

CloudFront オリジンの作成

CloudFront > ディストリビューション > ディストリビューションID
オリジン > オリジンを作成を選択、

Origin domainでは先ほど作成したAPI Gatewayを選択してください。

カスタムヘッダーを追加 - オプションヘッダーを追加を押してください。
カスタムヘッダーは、APIのリクエストもWAFを通したいため、CloudFront経由でしかAPI Gatewayにアクセス出来ないようにするためのもので、API Gatewayのリソースポリシーにも設定します。

ヘッダー名はReferer、値には適当な設定してください。
入力が完了したら右下のオリジンを作成を押してください。

CloudFront オリジンの作成

CloudFront > ディストリビューション > ディストリビューションID
ビヘイビア > ビヘイビアを作成を選択、

パスパターン情報は/api/*を選択、
オリジンとオリジングループでは先ほど作成したAPI Gatewayを選択してください。

ビューワープロトコルポリシーはRedirect HTTP to HTTPSを選択、
許可された HTTP メソッドはGET, HEAD, OPTIONS, PUT, POST, PATCH, DELETEを選択、

キャッシュポリシーはCachingDisabled
オリジンリクエストポリシーは、AllViewerExceptHostHeaderを選択して、ビヘイビアを作成を押してください。

必ずCloudfrontのビヘイビアのパスとAPI gatewayのステージ名は同じにしてください。

API Gateway リソースポリシー設定

ポリシーを作成を選択、

ポリシーを入力したら変更を保存を押してください。

ポリシーは下記のように入力してください。
基本的には全ユーザーに対してAPI Gatewayの呼び出しを許可してリクエストのRefererヘッダが特定の値と等しくない場合には、そのリクエストを拒否するというポリシーです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "arn:aws:execute-api:<リージョン名>:<アカウントID>:<API Gateway
のID>/*/*/*",
      "Condition": {
        "StringNotEquals": {
          "aws:Referer": "<CloudFront オリジンの作成で設定したRefererの値>"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "arn:aws:execute-api:<リージョン名>:<アカウントID>:<API Gateway
のID>/*/*/*"
    }
  ]
}

設定が保存されたら、再度デプロイしてください。

API Gatewayのエンドポイント

CloudfrontとAPI Gatewayの統合した後のAPI Gatewayのエンドポイントは下記のようになります。
ディストリビューションドメイン名+Cloudfrontのビヘイビアのパスパターン(/api/*)なので今回は
https://<識別子>.cloudfront.net/api/になります。

統合の確認

デプロイが完了したらURLを呼び出すに記載されているURLに/api/を追加して、ブラウザからアクセスしてください。CloudFront経由ではないので拒否されるのが正しいです。

先ほど説明したhttps://<識別子>.cloudfront.net/api/では問題なくリクエストが送れていると思います。

参考にさせていただきました

https://note.com/hirozki/n/ncdece0191daa

終わりに

何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉

Discussion