CloudFrontとAPI Gatewayを統合してセキュアなAPIを実現する方法
はじめに
既にCloudFront、API Gatewayの作成、設定は終わっていることとして進めます。
それぞれの詳しい設定は下記の記事を参考にしてください。
CloudfrontとAPI Gatewayを統合するメリット
パフォーマンスの向上
CloudFrontはグローバルに分散されたエッジロケーションを通じてコンテンツをキャッシュし、エンドユーザーにより近い場所からAPIレスポンスを提供することができます(CDN)。これにより、レイテンシーが大幅に削減され、APIの応答速度が向上します。
セキュリティの向上
既に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/
では問題なくリクエストが送れていると思います。
参考にさせていただきました
終わりに
何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉
Discussion