質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

意見交換

クローズ

4回答

1409閲覧

APIGWのサービス閉塞方式

dbfreak

総合スコア20

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2023/05/10 15:38

編集2023/05/11 02:34

0

0

実現したいこと

  • リリース作業時(DBデータ移行を伴うAPIリリース)にエンドユーザに対してメンテナンス中である旨を応答したい

前提

  • aws APIGW + lambda + RDSの3階層アーキテクチャ
  • リリース作業中はサービス提供不可
  • awsとしてのメンテナンスではなく、自社プロダクトのリリース時に計画作業としてサービス閉塞する場合のお話です

内容

直感的にはAPIGWのフロントにALBを配置して、ターゲットグループを切り替える等の方法で
メンテナンス中はそもそもAPIGWにトランザクションが流入しないようにするのかなと思いました。

ぐぐっても良い事例やノウハウが見つけられなかったので
上記を実現するための事例、一般論、ベストプラクティスをご存じの方いらっしゃればご意見お聞かせください。

調査したこと

https://qiita.com/mitzi2funk/items/7dfd07ec00b916b8dfc6
こちらにはAPIGWのフロントにWAFを配置する例が紹介されていますが、WAFはセキュリティアプライアンスなのでサービス閉塞に活用するには抵抗がありますし、403を応答するようですが利用者に無用な混乱を与えかねないことから自分達で用意したメンテナンス応答をしたいと考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答4

#1

yu_1985

総合スコア7447

投稿2023/05/11 03:14

編集2023/05/12 05:52

403を返すのが気になるなら、AWS WAFではカスタムレスポンスを設定することができるのでそれを応用するとよいのではないでしょうか。
[update] AWS WAFがカスタムレスポンスに対応しました
もっとも単純なのはAWS WAFをAPI Gatewayと直接連携させて、block時のレスポンスを503にすることですね。
ちゃんとした挙動のSorryページがなくてもいいならそれでも十分です。
別に「セキュリティアプライアンスなので」というのはあまり考えなくて良いです。
もう少しきちんとした挙動のSorryページを用意していてそれを使いたいならまた別の工夫が必要になるかもしれません。
以前はWAFのblock時のレスポンスをいじることができなかったので、前段にCloudFrontをかませてカスタムエラーレスポンスを503にする必要があり、CloudFrontを使っていないサービスでもそのためにわざわざCloudFrontを使ったりしてました。

追記
別回答にてWAFを使わない方法について言及されていますが、自分もそれらのページは一通り見ました。
その上であえて回答に記載しなかったのは下記の理由です。

  • 前提として、ALBのターゲットグループにAPI Gatewayを設定することはできない。現状もそのような構成にはなっていない(と、読み取れる)
    • そのため、リスナールールの順位変更によりALBのレスポンスでメンテナンスページを表示する手法を使うメリットがほとんどない
  • 参考にしているページはCloudFront+S3・ALBの構成であり、今回の構成とは異なる
    • 今回のケースだと、このためにわざわざ今回使っていないCloudFrontを用意することになりますが、それよりはAPI Gatewayに対して直接AWS WAFを適用するほうが圧倒的にシンプル

AWS WAFがセキュリティアプライアンスだから…というのはさして意味のない区分で、それよりも機能として何ができるのかに目を向けるべきかと思います。

ちなみに、他にもRoute53のFailoverを使う方法なども考えられましたが、DNSレコードを弄るとレコードが変なふうにキャッシュされたときに面倒なのでこちらもあえて記載していません(DNS周りにそれほど詳しくないから触りたくないというのはありますが…)。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

166

総合スコア29

投稿2023/05/12 05:09

  1. WAFはセキュリティアプライアンスで活用に抵抗がある。
  2. 403での応答は利用者に混乱を与える可能性があり避けたい。
  3. 今後のプロダクトリリース時の計画作業に加えていきたい。
  4. メンテナンス中、自社/開発チームのアクセスは本番環境へルーティングしたい。

というのがポイントという解釈をいたしました。
このポイントを叶えるのであればdbfreakさんの下記のお考えの通りだと思います。

ALBを配置して、ターゲットグループを切り替える等の方法

またすでに調査されたページにも記載があったページのやり方に近い方法を探ってみました。
https://qiita.com/mitzi2funk/items/7dfd07ec00b916b8dfc6

具体的な作業については、下記を参考にしていただきつつも表現できるWebページの文字数制限に注意が必要です。
https://qiita.com/chibiharu/items/7995b2a661ad1863db9e
そのため、調査されていたページに記載のあった下記を利用して、
転送先はS3に配置した静的ページを指定して表示する。
https://qiita.com/mitzi2funk/items/7dfd07ec00b916b8dfc6#-alb-listener-rule

WAFやCloudFrontを使わない方法は上記でいかがでしょうか。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#3

dbfreak

総合スコア20

投稿2023/05/12 06:33

#1
yu_1985様
素晴らしい回答をありがとうございます。静的なページであればWAFでも対応可能ですね。
今回はご教示いただいたWAF案で問題なさそうです。

複雑なページを返すようであれば、route53でTTLを短縮しつつ、メンテ応答用サーバにルーティングさせる感じですね。(利用者側のキャッシュ保持期間が気になります)

前提として、ALBのターゲットグループにAPI Gatewayを設定することはできない。

なるほど、、ノックアウトファクターですね。今回の構成ではフィジビリティが無いようです。
ご教示いただきありがとうございます。

AWS WAFがセキュリティアプライアンスだから…というのはさして意味のない区分

他部の管轄なのでWAFを触りたくないという意識があり、深掘り検討することを放棄してました。
耳が痛いですが、ご指摘の通りです。使えるものは使っていきたいと思います。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#4

dbfreak

総合スコア20

投稿2023/05/12 06:41

#2 166様
ご回答ありがとうございます。
ALBのバックエンドにAPIGWを統合できないようですので今回は使えなそうですが、
リスナールールに直接レスポンスを定義できることは知らなかったので新しい学びになりました。
有用な情報をありがとうございました。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問