新規リージョン追加に合わせてAWS CLIもアップデートしないといけなかった話

AWS CLIをアップデートしてなかったことが原因でエラーに遭遇した記録です。
2020.04.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

結論としてはAWS CLIを定期的にアップデートしましょうね、という話です。ただそれだけで終わってしまっては「お前なに当たり前のこと言ってんの?」と石を投げられてしまうので、遭遇した事象について残しておきます。

ことの経緯

弊社内で稼働しているシステムにおいて、ある日、次のようなエラーが出力されて正常に終了できないタスクがありました。

Could not connect to the endpoint URL: "https://iam.me-south-1.amazonaws.com/"

me-south-1はバーレーンリージョンです。なぜ他のリージョンではエラーが出ず、ここだけダメなんでしょう?というか、IAMってグローバルエンドポイントじゃないっけ?など、とにかく最初はよく分かりませんでした。ちなみにこのエラーメッセージで検索すると、リージョン名指定ミスによるS3接続エラーのものがヒットしました。IAMの事例はパッとは見つからず……。

さて、バーレーンはオプトインリージョンですね。何か特殊な状況がある?と考え、別のアカウントで有効化したりもしたのですが変なところは見つからず。挙げ句の果てには、手元で再現しようとしても再現しない!

$ export AWS_DEFAULT_REGION=me-south-1
$ aws iam list-account-aliases
{
    "AccountAliases": []
}

いよいよ困ってしまったのですが、「一応バージョンも確認しておくか」と思いついて、環境で使用しているライブラリのバージョンを確認してみることに。

こっちが手元の環境。

$ aws --version
aws-cli/2.0.0 Python/3.7.4 Darwin/19.4.0 botocore/2.0.0dev4

こっちが稼働していた環境。

$ aws --version
aws-cli/1.15.80 Python/2.7.14 Linux/4.14.88-88.76.amzn2.x86_64 botocore/1.10.79

お、だいぶ違いますね。一筋の光明にすがって再現できるかにチャレンジすることにしました。

エラーを再現しよう

というわけで続いて再現です。さすがにそのまんまインストールするのは嫌だったのでDockerを利用します。とても便利。

$ docker run --rm -it -v $HOME/.aws:/root/.aws python:3.8 bash

root@xxx:/# cd ~
root@xxx:~# pip install awscli==1.15.80
root@xxx:~# aws --version
aws-cli/1.15.80 Python/3.8.2 Linux/4.19.76-linuxkit botocore/1.10.79
root@xxx:~# aws iam list-account-aliases
[
    "arn:aws:iam::147935325171:role/cm-config-role-all-regions"
]
root@xxx:~# export AWS_DEFAULT_REGION=me-south-1
root@xxx:~# aws iam list-account-aliases

Could not connect to the endpoint URL: "https://iam.me-south-1.amazonaws.com/"

再現できたよ!ついでにアップデートで解決できるかも確認します。

root@xxx:~# pip install --upgrade awscli
root@xxx:~# aws --version
aws-cli/1.18.39 Python/3.8.2 Linux/4.19.76-linuxkit botocore/1.15.39
root@xxx:~# aws iam list-account-aliases
{
    "AccountAliases": []
}

解決したよ!

というわけで、AWS CLIをアップデートしてことなきを得ました。めでたし、めでたし。

結局原因はなんだったのか

AWS CLIが古いためバーレーンリージョンの情報を持っていなかったことに起因していました。具体的には次のコミットでbotocoreに追加されています。

Update to latest endpoints · boto/botocore@e77cae1

バージョンとしては1.12.198です。エラーが出ていたAWS CLIではbotocoreは1.10.79だったのでダメだったわけです。次に気になるのはこのbotocoreを使うAWS CLIのバージョンはいくつなんだってことですが、調べてみると1.16.208でした。そのためこれ以降のバージョンであればエラーは発生しないことになります。え?調べ方ですか?botocoreのリリースが 30 Jul 2019 だったのでこれ前後のバージョンをしらみつぶしに試しただけです。

まとめ

AWS CLIは定期的にアップデートしましょうね。最初に言ったやつ!