結論
AWS無料利用枠終了後にアカウントが一時停止し、有料プランにアップグレードしたところ、
- CloudFront + S3 のフロントエンドは即時復旧
- しかし Elastic Beanstalk(以下 EB)のバックエンド API は正常に動いていなかった
- EBで
Unable to assume roleの警告が出ており、アプリケーションサーバー再起動で完全復旧した
結論として、「有料プランにしアカウント復帰=全部すぐに復旧」ではなかった、というのが今回の学びです。
何が起きたか(時系列)
1. AWS無料利用枠終了 → アカウント停止
前日まで正常稼働していた、EB、S3、Cloudfrontに構築したWEBシステムに突如繋がらなくなりました。
繋がらなくなり、AWSコンソールを確認しようとしたところ、パスワード入力後エラーになり、無料利用枠が終了し、AWS アカウントが一時停止状態という案内画面が表示されました。
以下メールが届いており、有料プランアップグレードを促されました。(※無料枠開始後にもらえる100USDクレジットを使い果たしたようです)
2. 有料プランにアップグレード
メール内のリンクから有料プランへアップグレード。
ここで「これで全部戻るだろう」と思っていました。
3. フロントエンドは復旧した
まず確認したのはフロント側。
- CloudFront 経由で画面は表示できる
- S3 配信の静的ファイルも問題なし
この時点で一瞬こう思いました。
「あ、もう復旧してるのかな?」
4. しかし画面のデータ一覧が空
API 経由で取得しているはずのデータ一覧が 空。
- 画面自体は表示される
- でもバックエンドからデータが返ってきていない
ここで違和感を覚えました。
5. Elastic Beanstalk を確認
EB のイベントログを確認すると、以下の Warning が出ていました。
Environment health has transitioned from Ok to Warning.
Unable to assume role
"arn:aws:iam::XXXXXXXXXXXX:role/aws-elasticbeanstalk-service-role".
Verify that the role exists and is configured correctly.
Health は Warning 状態。
この時の正直な思考はこれです。
「有料プランに戻したのに、まだ IAM ロール系が壊れてる?」
6. 判断がつかなかったポイント
ここが一番ハマった点です。
- アカウントは復旧している
- フロントは見れる
- でも EB は Warning
- API は動いていないように見える
この状態だと、
「実はもう直ってるけど、表示だけ Warning なのか?」
「それとも本当に壊れてるのか?」
判断がつきませんでした。
7. アプリケーションサーバー再起動
最終的に EB 環境の アプリケーションサーバーを再起動。
すると、
-
role assumeWarning が消える - Health が
Okに戻る - API 疎通を確認
- 画面のデータ一覧が正常表示
ここで 完全復旧を確認 できました。
なぜフロントだけ先に復旧したのか(考察)
これは断定ではなく、今回の状況からの推測です。
- CloudFront / S3
- 静的配信
- IAM サービスロール依存が少ない
- Elastic Beanstalk
- Health Check
- 内部 AWS API
aws-elasticbeanstalk-service-role
AWS アカウント停止 → 復旧直後の状態では、
- フロントは問題なく配信可能
- しかし EB 側は IAM role assume 周りが不安定
その結果、
フロントは見れるが、バックエンド API は正常に動いていない
という「部分復旧」状態になった可能性が高いと考えています。
role assume Warning は「表示だけ」ではなかった
今回のポイントはここです。
role assume の Warning は、
- Health 表示だけの問題
- 無視してもいい警告
と思いがちですが、
今回は実際に API が正常に動作していませんでした。
- Warning が出ている
- かつ API のレスポンスがおかしい
この場合は、実害あり と考えた方が良さそうです。
なぜ再起動で直ったのか(推測)
これも推測になりますが、
- 有料プラン復旧後
- IAM assume role が可能な状態に戻る
- ただし既存プロセスは不整合を抱えたまま
- 再起動で
- 正常な role を再取得
- EB Health が回復
という流れだった可能性があります。
設定ミスというより、
AWS 側の状態変化に EB が追従しきれていなかった 印象です。
ちなみに別のEB環境も同様にUnable to assume roleの警告が出ていましたが、アカウント復帰から数時間経過後、フロントからAPI確認すると、正常につながりました。(EB HealthもOKとなっていました。)
学び・再発防止
今回の件での教訓です。
- AWSアカウント停止後、S3,CloudFrontは即時復旧するが Elastic Beanstalkは復旧に時間がかかる
- 無料利用枠終了前に
- 有料プランアップグレード
- AWS Budgetsでアラート設定
をしておくと良い。
まとめ
AWS無料利用枠終了後の復旧では、
- フロントとバックエンドが 同時に復旧するとは限らない
- Elastic Beanstalk の
role assumeWarning は
API 不通という実害を伴うことがある
同じ状況で迷っている人の参考になれば幸いです。
