LambdaでEC2インスタンスを起動しコマンド実行後にインスタンス停止する方法
停止しているUbuntuのEC2インスタンスを起動してから、スクリプトを実行し、その結果をメールで送信してから、また停止するということをやりたいです。
次のようなLambda関数を書いて実行しました。
import boto3
instanceId = 'i-xxxxxxxx'
instance = boto3.resource('ec2').Instance(instanceId)
statusDict = {'pending' : 0,
'running' :16,
'shutting-down':32,
'terminated' :48,
'stopping' :64,
'stopped' :80
}
ec2 = boto3.client('ec2')
ssm = boto3.client('ssm')
def lambda_handler(event, context):
try:
state = instance.state
stateCode = state['Code']
if stateCode == statusDict['running']:
print('Instance is already running.')
else:
response = instance.start()
print(response)
instance.wait_until_running()
print('Succeed to start instance')
print(ssm.describe_instance_information())
waiter = ec2.get_waiter('instance_status_ok')
waiter.wait(InstanceIds=[instanceId])
print(ssm.describe_instance_information())
ssm.send_command(
InstanceIds = [instanceId],
DocumentName = "AWS-RunShellScript",
Parameters = {
"commands": [
"python3 ./example.py",
"cat log.txt | sendmail example@gmail.com",
"aws ec2 stop-instances --instance-ids i-xxxxxxxxx",
],
"executionTimeout": ["3600"],
"workingDirectory":["/home/ubuntu/example/"]
},
)
except Exception as e:
print(e)
raise e
これを実行すると、メールの送信までは実行されるのですが、インスタンスの停止が行われません。
サーバーにはawsがインストールされていて、サーバーにsshでログインして同じコマンドを入力するとちゃんと停止されることは確認しています。
スクリプト実行後にインスタンスを停止するためにはどうすればいいでしょうか。