てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible/EDA] EDA Controller でログイン時に 400 Bad Request のエラーになる現象と対処

はじめに

AAP 2.4 のインストーラーを利用インストールした EDA Controller のうち、特定の環境だけが、ログインしようとすると HTTP 400 のエラーが発生しました。

現象と原因、対策をまとめます。

[2023/08/01 追記]

本記事投稿後、Red Hat カスタマーポータルのナレッジベースに、本事象の記事があがっていました(更新日時 2023年7月12日)。アクセスできる方はナレッジベースをご覧ください。

access.redhat.com

現象

正しいはずのログイン情報を入力してログインしようとしても以下のようなメッセージが表示されました。

Request failed with status code 400 Bad Request

Request failed with status code 400 Bad Request

調べたこと・原因

直接的な原因

たまたまなのですが、とあるAPI の画面を開こうと https://<EDA Controller のグローバルIPアドレス>/api/eda/v1/docs を開こうととしたら、以下の表示になりました。

「A」はEDA Controller のグローバルIPアドレス

肝のエラーメッセージは以下の箇所です。

Invalid HTTP_HOST header: '<EDA Controller のグローバルIPアドレス>'. You may need to add '<EDA Controller のグローバルIPアドレス>' to ALLOWED_HOSTS.

おやおやと思ってこのページの方を見ると ALLOWED_HOSTS が以下の設定になっていました。

ALLOWED_HOSTS      ['localhost', '<EDA Controller のプライベートIPアドレス>', 'fe80::x:x:x:x']

これでは、HOST ヘッダーが制限されているため、EDA Controller にアクセスするには、EDA Controller 自身から https://localhost と指定するか、 プライベートIPでアクセスできるところから、https://<<EDA Controller のプライベートIPアドレス> と指定するしかありません。

そのため、https://<EDA Controller のグローバルIPアドレス>/400 Bad Request となってしまったということです。

原因の原因

ALLOWED_HOSTS は、複数のアドレス要素から形成されます。以下に例を上げます。(AAP のインストーラーの処理を追いました)

  • インストール時の inventory[automationedacontroller] 内に指定した EDA Controller の ansible_host
  • ファクト ansible_all_ipv4_addressesansible_all_ipv6_addresses
  • inventory[all:vars] 配下で指定した automationedacontroller_allowed_hostnames (デフォルトは空リスト)

ところが、今回利用したのは EC2 インスタンスなので インスタンス自体はグローバルIPアドレスを直接持ちません。そのため、上記のアドレス要素たちの中にグローバルIPアドレスが登場しないことがありえます。結果として、グローバルIPアドレスでアクセスできない、ということになります。

対策

対策は主に2つ考えられます。

対策1: インストーラーの再実行

AAP のインストーラーの inventory[all:vars]automationedacontroller_allowed_hostnames 変数(ドキュメントにも掲載あり)を指定します。

例:

[all:vars]
# 略
automationedacontroller_allowed_hostnames='EDA ControllerのグローバルIPアドレス'

ここで指定したアドレスが、設定 ALLOWED_HOSTS に「追加」されます。

この状態で、再度 AAP のインストーラーを実行します。

対策2: 設定変更

AAP のインストーラーを追って分かった方法ですが、/etc/ansible-automation-platform/eda/environmentEDA_ALLOWED_HOSTS に、許可したいアドレスをカンマ区切りで追加して、以下のコマンドで EDA のサービスを再起動します。

sudo systemctl restart automation-eda-controller

なお、/etc/ansible-automation-platform/eda/environment は、ユニットファイル /usr/lib/systemd/system/automation-eda-controller.target 内の EnvironmentFile で指定されていました。

これでログインを再度試すとログインできます。

おわりに

この制限は Automation Controller よりもきついように感じます。EDA Controller の IP アドレスを変更した場合でも起こりうる現象です。そのため、セキュリティの考えや、構成、運用方法にもよりますが、利便性と天秤にかけて * を許可することも検討してもいいかもしれません。