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になるまでプロンプトが返ってきませんでした。
スクリプトの長さがスッキリするかどうかはさておき、なんとなく直感で分かる見やすいコードにはなりそうです。