NAT Gateway上EIPの削除及び作成直後のステータス取得にはfilterへstate指定を忘れずに

NAT Gateway上のEIP削除・作成実行直後に該当EIPのステータスを取得する場合は、statusによる絞りを忘れずに入れておきましょう。
2020.02.04

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

はじめに

CFnのスタック再作成によるECSの更新を行おうとした所、想定しえない部分でハマりをみました。

An error occurred (InvalidElasticIpID.NotFound) when calling the CreateTags operation: The elasticIp ID 'eipalloc-XXXXXXXXXXXXXXX' does not exist

管理コンソール上のEIP一覧を見ると、該当するEIPのIDは存在していません。「はて何が起こったんだろう」と傾げつつ、解決にまで至った過程をまとめました。

エラーの原因

スタック作成用のバッチではaws ec2 describe-nat-gatewaysで取得したAllocationIdを用いて、aws ec2 create-tagsにてタグ付けを行う処理を行っています。

ただ、存在していないEIPが渡ってきている状態です。実際のNAT Gateway上にあるEIPはどうなっているのか、バッチ内のコマンドを直実行で確認したところ、

> aws ec2 describe-nat-gateways --filter Name=tag:Name,Values=XXXXXX | jq -r '.NatGateways[].NatGatewayAddresses[]'
{
  "PublicIp": "............",
  "NetworkInterfaceId": "eni-IIIIIIIIIIIIIIIIII",
  "AllocationId": "eipalloc-XXXXXXXXXXXXXXXXXX",
  "PrivateIp": ".........."
}
{
  "PublicIp": "............",
  "NetworkInterfaceId": "eni-IIIIIIIIIIIIIIIIII",
  "AllocationId": "eipalloc-YYYYYYYYYYYYYYYYYY",
  "PrivateIp": ".........."
}

と、2つでてきました。上のAllocationIdは存在していないとされているもので、下のAllocationIdが管理コンソール上で存在が確認できたものです。これだけだと詳細が不明ですが、恐らくは何らかの絞りが足りていない。

対処

EIPは削除を実行すると、available から deleting に、そして deleted へと変わります。 describe-nat-gateways — AWS CLI 1.17.9 Command Reference

CFnでのスタック更新にてEIPの削除と作成が発生した場合、タイミング次第ですがfilterstatusの絞りを入れてなければ delete と available 双方のEIPがでてくる状態となります。

よって、意図した処理には

aws ec2 describe-nat-gateways --filter Name=tag:Name,Values=XXXXXX Name=state,Values=available | jq -r '.NatGateways[].NatGatewayAddresses[]'

とするのがベターだということになります。

あとがき

今回のスタック再作成に至った理由は、以前ECSの更新速度検証での無茶な値付けが原因で、該当設定を操作しても更新が上手く行かないためでした。該当スタックでのchange-setによる更新時にエラーが起こるため、解消すべく一度削除した上での作成としました。

CloudFormationでECS更新速度に関連した設定を操作する

色々な要因が重なった結果での今回のエラー対処となりましたが、結果としてEIPの操作には時間差も考慮が必要だと分かりました。EIP操作を含んだスタック操作機会はそこまで多くないかもしれませんが、万が一同様な状態にて解決の糸口になれば幸いです。