boto3 request_spot_instances method does not work with "UserData"

1.3k Views Asked by At

I'm trying to make AWS EC2 spot instance request via AWS Lambda, and using boto3 to make call to EC2 API.

Now I can create spot instance, but "UserData" param is not working.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import boto3
import json
import logging
import base64
import os
from pathlib import Path

def request_spot_instance(access_key, secret_key):
    ec2_client = boto3.client('ec2',
    aws_access_key_id = access_key,
    aws_secret_access_key = secret_key,
    region_name = 'ap-northeast-1'
)
response = ec2_client.request_spot_instances(
    SpotPrice = '0.2',
    Type = 'one-time',
    LaunchSpecification = {
        'ImageId': 'ami-be4a24d9',
        'KeyName': 'my_key',
        'InstanceType':'c4.large',
        'UserData': base64.encodestring(u'#!/bin/sh \n touch foo.txt'.encode('utf-8')).decode('ascii'),
        'Placement':{},
        'SecurityGroupIds':[
            'sg-6bd2780c'
        ]
    }
)
return response


def lambda_handler(event, context):
    response = request_spot_instance(os.environ.get('AWS_ACCESS_KEY_ID'), os.environ.get('AWS_SECRET_ACCESS_KEY'))
    print(response)
    return event, context

if __name__ == "__main__":
    lambda_handler("","")

I'm using this code with Python 2.7.11.

The response of request method is:

{u'SpotInstanceRequests': [{u'Status': {u'UpdateTime': datetime.datetime(2016, 12, 23, 6, 11, 8, tzinfo=tzutc()), u'Code': 'pending-evaluation', u'Message': 'Your Spot request has been submitted for review, and is pending evaluation.'}, u'ProductDescription': 'Linux/UNIX', u'SpotInstanceRequestId': 'sir-cerib8cg', u'State': 'open', u'LaunchSpecification': {u'Placement': {u'AvailabilityZone': 'ap-northeast-1c'}, u'ImageId': 'ami-be4a24d9', u'KeyName': 'miz_private_key', u'SecurityGroups': [{u'GroupName': 'ssh only', u'GroupId': 'sg-6bd2780c'}], u'SubnetId': 'subnet-32c6626a', u'Monitoring': {u'Enabled': False}, u'InstanceType': 'c4.large'}, u'Type': 'one-time', u'CreateTime': datetime.datetime(2016, 12, 23, 6, 11, 8, tzinfo=tzutc()), u'SpotPrice': '0.200000'}], 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': '285867eb-9303-4a6d-83fa-5ccfdadd482f', 'HTTPHeaders': {'transfer-encoding': 'chunked', 'vary': 'Accept-Encoding', 'server': 'AmazonEC2', 'content-type': 'text/xml;charset=UTF-8', 'date': 'Fri, 23 Dec 2016 06:11:08 GMT'}}}

This response does not not include "UserData", which seems differ from wrote in boto3 manual. I'm suspecting UserData param is not accepted.

Any suggestions are welcome.

1

There are 1 best solutions below

0
On

Self resolved.

The user data shell script was executed at root "/" directory, and simply I could not find the generated file.

$ ls -al /foo.txt
-rw-r--r-- 1 root root 0 Dec 23 07:03 /foo.txt