sorta kinda...

主にAWS関連ですが、これに限らずいろいろ勉強したことや思ったことを書いていきます。

boto3のresourceを使ってEC2インスタンスを停止&起動させてみた

前回は、boto3のresourceを使ってEC2インスタンスの情報を取り出しました。 nasrinjp1.hatenablog.com

今回は、EC2インスタンスの起動&停止をしてみます。まずは接続から。

>>> import boto3
>>> access_key = '****'
>>> secret_key = '****'
>>> region = 'ap-northeast-1'
>>> session = boto3.session.Session(region_name=region, aws_access_key_id=access_key, aws_secret_access_key=secret_key)
>>> ec2 = session.resource('ec2')

早速やってみましょう。起動済みのEC2インスタンスを停止させます。私のテスト用環境にはEC2インスタンスは1つしかないので、手を抜いてall()でインスタンスオブジェクトを取っていますが、通常はFilterで絞ったり、ID指定することになると思います。

>>> for i in ec2.instances.all():
...     i.stop()
...     i.wait_until_stopped()
...
{'StoppingInstances': [{'InstanceId': 'i-********', 'CurrentState': {'Name': 'stopping', 'Code': 64}, 'PreviousState': {'Name': 'running', 'Code': 16}}], 'ResponseMetadata': {'HTTPStatusCode': 200, 'RequestId': '****'}}

stop()が実行された直後にこのJSON形式の結果が出てきます。CurrentStateが"stopping"になっているのが分かります。(PowerShellでテストしたので、JSONのフリしたテキスト表示になりました。きれいに整形する気力もありませんでした。すいません。)

wait_until_stopped()はこのJSON形式の結果が表示された後に実行されて、実際にEC2インスタンスのCurrentStateが"stopped"になるまで何もプロンプトを返しませんでした。これで自作waitスクリプトを作らなくても済みますね。

では停止したEC2インスタンスを再度起動します。

>>> for i in ec2.instances.all():
...     i.start()
...     i.wait_until_running()
...
{'StartingInstances': [{'InstanceId': 'i-********', 'CurrentState': {'Name': 'pending', 'Code': 0}, 'PreviousState': {'Name': 'stopped', 'Code': 80}}], 'ResponseMetadata': {'HTTPStatusCode': 200, 'RequestId': '****'}}
>>>

stop()と同様に、start()を実行した際に結果が表示されて、runningになるまでプロンプトが返ってきませんでした。

スクリプトの長さがスッキリするかどうかはさておき、なんとなく直感で分かる見やすいコードにはなりそうです。