km_output

お勉強と趣味のアウトプット

【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最適化をサポートしないインスタンスタイプでの起動ができなくなる。

dev.classmethod.jp

これに対応したくて、Lambdaのboto3ではどうやってEBS最適化の有効化/無効化をするんだろうと調べてたどり着いたのが modify_instance_attribute でしたとさ。