【AWS】LambdaでEC2起動したくてmodify_instance_attributeと戯れた話
前提
Lambdaでインスタンスタイプ変更→EC2インスタンス起動、失敗したら他のインスタンスタイプへ変更して起動を試みる…という仕組み。
改修する機会があって動かしていたときのエラーと対処法をまとめる。
エラーと対処法
エラーその1
An error occurred (Unsupported) when calling the StartInstances operation: Your requested instance type (t3a.medium) is not supported in your requested Availability Zone (ap-northeast-1c). Please retry your request by not specifying an Availability Zone or choosing ap-northeast-1a, ap-northeast-1d.
→AZ未対応インスタンスタイプを指定するとこうなる。
上記は東京リージョンのAZ-1cでt3a.mediumを起動しようとした際のエラー。
AZ-aだとt3a.mediumで起動できるのだが。
インスタンスタイプのリストをAZごとに分けて、AZ-cのときt3aを指定しないようにすることで回避。
エラーその2
An error occurred (InvalidParameterCombination) when calling the ModifyInstanceAttribute operation: These parameters are mutually exclusive: attribute, ebsOptimized
→訳あってEBS最適化を無効化したかったが、書き方がアカン。
modify_instance_attributeに余計な引数を入れていたので消したら動いた。
if instance_type == 't2.medium': ec2.modify_instance_attribute( Attribute='ebsOptimized', # この行が不要 EbsOptimized={'Value': False}, InstanceId=instance_id )
余談だが、EBS最適化を有効化したままだとEBS最適化をサポートしないインスタンスタイプでの起動ができなくなる。
これに対応したくて、Lambdaのboto3ではどうやってEBS最適化の有効化/無効化をするんだろうと調べてたどり着いたのが modify_instance_attribute
でしたとさ。