研究開発部 Architectグループ ML PlatformチームのKAZYこと新井です。
今回はGCP App Engine(GAE)でサービスのバージョンにアクセスするとDNS_PROBE_FINISHED_NXDOMAINが出てしまった話というテーマです。
結論
はじめに結論を書いてしまうのですが、原因は以下の制約違反していたため起きたものでした。*1
VERSION-dot-SERVICE-dot-PROJECT_ID 全体の長さ(VERSION はバージョンの名前、SERVICE はサービス名、PROJECT_ID はプロジェクト ID)は、63 文字以下にする必要があります。
要するに特定のバージョン用のURLのドメインを63文字以下にしなければならないということです。
GCP PROJECT_IDやGAEのサービス名変更は影響範囲が広いので今回はバージョンの付け方を工夫して63文字以下に収まるようにして問題を解決しました。
振り返るとドメインに関する基本的な事項ではあるのですが、私はこれまであまり意識してこなかった領域だったのでGAE側の設定がなにかおかしいのかなと、調べる方向性を誤って苦労しました。
背景
弊社ではいくつかのマイクロサービスをGCPのApp Engineを用いて構築しています。GAEではサービスのバージョンを管理することができ、バージョン間でトラフィックを移行させることでblue green deploymentが簡単できます。そのためサービスのデプロイをする際は、最新バージョンの動作確認をしてからリクエストのトラフィックを移行させるという手順を行っています。*2
問題
あるサービスを新たにGAEでデプロイにしようと思い、いつものようにサービスの最新バージョンにアクセスしようとしたところ以下のようなエラーが出てサービスにアクセスができませんでした。
このサイトにアクセスできません https://VERSION-dot-SERVICE-dot-PROJECT_ID.appspot.com にタイプミスがないか確認してください。 DNS_PROBE_FINISHED_NXDOMAIN
GAEのコンソールにあるリンクから飛んだのでURLにタイプミスはなく、これまでリリースしてきた他サービスとデプロイの設定が同じだったため、何が問題か原因が全くわかりませんでした。検証環境にて恐る恐るトラフィックを移行させてみるとサービスは問題なく動作しており謎は深まるばかりでした。
GAEを用いた他サービスとの比較や、GAE自体の設定や仕様が変わってしまったのではないかと考えたり、知見がありそうな人に聞いたりググったり、ドキュメントを読み漁ったりしました。。。
トラフィックを流すまで動作確認できない状態で本番運用していくのは到底許容できるものではないため、慌てて調査をしました。
対応策
調べること数時間、、ようやく原因がわかりました。*3
新たにリリースしようとしたサービスの名前が他より長くVERSION-dot-SERVICE-dot-PROJECT_IDの文字数が63文字を超えているためでした。ドキュメントにもちゃんと書いてありました。文字数を減らすためにできることとしてプロジェクトID、サービス名、バージョンを短くすることが考えられますが、今回はバージョンの命名規則を変えて文字数を少なくして対応しました。*4
ちなみにgcloudコマンドでデプロイをする際は--version
オプションを付けることで任意のバージョンをつけることができます。
# 例:Gitのコミットハッシュ先頭から5文字をバージョンとする gcloud app deploy --version ${GIT_COMMIT_HASH_SHORT:0:5}
おわりに
同じことを踏んでしまった人や記事に出会えず、結構ハマってしまったのでこの記事がどなたかのお役に立てればと思います。
ありがとうございました。
アナウンス
求人
私の所属するML Platformチームを含む、研究開発部Architectグループでは一緒に働く仲間を募集しています。 特に私の所属する中部支店はこれまでクローズドだったのでオススメです。一緒に働きましょう。
R&D MLOps/DevOpsエンジニア / Sansan株式会社
*1:次リンクのservice項目に書いてあります。https://cloud.google.com/appengine/docs/standard/go/config/appref#runtime_and_app_elements
*2:gcloudコマンドを利用する場合は--no-promoteをプションをつけると自動でトラフィックが移行しません。 https://cloud.google.com/appengine/docs/flexible/nodejs/testing-and-deploying-your-app#testing-on-app-engine
*3:運用の品質に関わるので、なるべく早く解決しようとGCPのサポートも利用しました。
*4:バージョンはデフォルトだと15文字のタイムスタンプ(例: 20220607t204530)で長めです。https://cloud.google.com/appengine/docs/standard/go/building-app#services_and_versions