AWS Boto3 Python运行_实例方法未解析UserData参数

AWS Boto3 Python运行_实例方法未解析UserData参数,python,amazon-web-services,boto3,Python,Amazon Web Services,Boto3,命令运行并创建实例,我可以登录、运行更新等,但用户数据文件没有传入 这是我的剧本: #!/usr/bin/python import boto3 def main(): dev_server_ami_id = 'ami-0b33d91d' # This is currently the Amazon Linux base AMI. dev_server_sec_group = 'xxxxxxxxxx' dev_server_az = 'us-east-1a'

命令运行并创建实例,我可以登录、运行更新等,但用户数据文件没有传入

这是我的剧本:

#!/usr/bin/python

import boto3



def main():


    dev_server_ami_id = 'ami-0b33d91d'  # This is currently the Amazon Linux base AMI.
    dev_server_sec_group = 'xxxxxxxxxx'
    dev_server_az = 'us-east-1a'
    dev_server_subnet_id = 'xxxxxxxxxxx'
    dev_server_name = 'test_server_name'
    dev_instance_type = 't2.large'
    slash_sites_size = 16
    slash_scratch_size = 5

    ec2client = boto3.client('ec2',aws_access_key_id='asdfasdfasdf',aws_secret_access_key='asdfasdfasdfasdf')

    creation_response = ec2client.run_instances(DryRun=False,MinCount=1,ImageId=dev_server_ami_id,
        MaxCount=1,KeyName='mcp_demo_dev',SecurityGroupIds=[dev_server_sec_group],
        InstanceType=dev_instance_type,Placement={'AvailabilityZone': dev_server_az},SubnetId=dev_server_subnet_id,UserData="file://C:\\Users\\xxxxx\\Dev\\Site Where My Script Is\\base_server_bootstrap.sh",
        BlockDeviceMappings=[{'DeviceName':'/dev/xvdb','Ebs':{'VolumeSize':slash_sites_size,'DeleteOnTermination':True}},
            {'DeviceName':'/dev/xvdc','Ebs':{'VolumeSize':slash_scratch_size,'DeleteOnTermination':True}}])
    instance_id = creation_response['Instances'][0]['InstanceId']
    ec2client.create_tags(Resources=[instance_id,],Tags=[{'Key':'Name','Value': dev_server_name,},],)



if __name__ == "__main__": main()
就脚本而言,这是一项正在进行的工作,我尝试了几个不同的选项来传递文件,包括文件名,因为python脚本和我的shell脚本位于同一目录中,只传递shell脚本名称,而不传递前面带有“file://”的完整路径,以及前面没有“file://”的完整路径和脚本名

任何技巧都值得赞赏,似乎run_instances方法只是忽略了该参数

这里是我试图传递到run_instance()方法中的shell脚本供参考。没有人叫它

#!/bin/bash

#
# These variables will be used to create directories and name everything client specific.
# All files that are pulled from S3 have to follow the naming convention and are client specific.
#

clientName="demo"
# If both author and public are true then we are in DEV.
magnoliaPublic=true 
magnoliaAuthor=true
# Set this if the client is doing light-module development work.
lightModule=true
lightModuleFileName="one-pager-module.zip"

# build the additional filesytems and mount points
sudo mkfs -t ext4 /dev/xvdb
sudo mkfs -t ext4 /dev/xvdc
sudo mkdir /sites
sudo mkdir /scratch
sudo mount /dev/xvdb /sites
sudo mount /dev/xvdc /scratch

# add them to the fstab so that they will be there after a reboot
sudo cat /etc/fstab > /home/ec2-user/fstab_temp
sudo echo -e "/dev/xvdb\t/sites\text4\tdefaults,nofail\t0\t2" >> /home/ec2-user/fstab_temp
sudo echo -e "/dev/xvdc\t/scratch\text4\tdefaults,nofail\t0\t2" >> /home/ec2-user/fstab_temp
sudo cp /home/ec2-user/fstab_temp /etc/fstab
sudo rm /home/ec2-user/fstab_temp

# Set up of the base environment with Java and Tomcat.

# Need to figure out how to set the specific version of the JDK that we install.  Either copy it to S3 or direct it through yum.
sudo yum -y install java-1.8.0-openjdk
sudo groupadd tomcat
sudo useradd -g tomcat tomcat
sudo wget -O /home/tomcat/apache-tomcat-8.5.9.tar.gz http://mirror.stjschools.org/public/apache/tomcat/tomcat-8/v8.5.9/bin/apache-tomcat-8.5.9.tar.gz
sudo tar -xf /home/tomcat/apache-tomcat-8.5.9.tar.gz -C /opt
sudo rm /home/tomcat/apache-tomcat-8.5.9.tar.gz
sudo chown -R tomcat:tomcat /opt/apache-tomcat-8.5.9/

# Create our individual JVM directory structure.
sudo mkdir /sites/
sudo mkdir /sites/${clientName}
sudo mkdir /sites/${clientName}/magnolia-base/
sudo mkdir /sites/${clientName}/light-module/
# If there is content to deploy to the light-module directory then grab it.
if $lightModule; then
    sudo aws s3 cp s3://mcp-${clientName}-light-module/${lightModuleFileName} /sites/${clientName}/light-module
    sudo unzip /sites/${clientName}/light-module/${lightModuleFileName} -d /sites/${clientName}/light-module/
fi
# Build the base tomcat directories for this client.
sudo mkdir /sites/${clientName}/magnolia-base/common /sites/${clientName}/magnolia-base/conf /sites/${clientName}/magnolia-base/logs /sites/${clientName}/magnolia-base/server /sites/${clientName}/magnolia-base/shared /sites/${clientName}/magnolia-base/temp /sites/${clientName}/magnolia-base/work
# Copy configs down from S3. mcp-demo-configs
sudo aws s3 cp s3://mcp-${clientName}-configs/${clientName}_conf.zip /sites/${clientName}/magnolia-base/
sudo unzip /sites/${clientName}/magnolia-base/${clientName}_conf.zip -d /sites/${clientName}/magnolia-base/

# Set one or more appBase directories and copy our Magnolia WAR files in.
if $magnoliaPublic; then
    sudo mkdir /sites/${clientName}/magnolia-base/webapps_public
    sudo aws s3 cp s3://mcp-${clientName}-magnolia-wars/demo-mcpLive-2.3.war /sites/${clientName}/magnolia-base/webapps_public
fi
if $magnoliaAuthor; then
    sudo mkdir /sites/${clientName}/magnolia-base/webapps_author
    sudo aws s3 cp s3://mcp-${clientName}-magnolia-wars/demo-mcpEdit-2.3.war /sites/${clientName}/magnolia-base/webapps_author
fi

sudo chown -R tomcat:tomcat /sites

# From here on out everything is done as the tomcat user.
sudo su - tomcat

# Set up the environment variables.
echo export "JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.29.amzn1.x86_64" >> /home/tomcat/.bash_profile
echo export JRE_HOME=\$JAVA_HOME/jre  >> /home/tomcat/.bash_profile

# Create our Tomcat setenv.sh file
touch /opt/apache-tomcat-8.5.9/bin/setenv.sh
echo export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxPermSize=256m -Xms64M -Xmx1024M -Djava.awt.headless=true" >> /opt/apache-tomcat-8.5.9/bin/setenv.sh
echo export CATALINA_HOME=/opt/apache-tomcat-8.5.9 >> /opt/apache-tomcat-8.5.9/bin/setenv.sh
echo export CATALINA_BASE=/sites/${clientName}/magnolia-base >> /opt/apache-tomcat-8.5.9/bin/setenv.sh
chmod 755 /opt/apache-tomcat-8.5.9/bin/setenv.sh

sudo -S -u tomcat -i /bin/bash -l -c '/opt/apache-tomcat-8.5.9/bin/startup.sh'

提前感谢。

您的用户数据指定不正确。用户数据的第一行应该指定它是shell脚本还是cloudinit脚本

:

用户数据外壳脚本必须以#开头!字符和要读取脚本的解释器的路径(通常为/bin/bash)。有关shell脚本的详细介绍,请参阅Linux文档项目(tldp.org)中的BASH编程指南

用于云初始化

#cloud-config
cloud init用户指令可以在启动时以与脚本相同的方式传递给实例,尽管语法不同。有关cloud init的更多信息,请转到


将脚本内容作为字符串传递给UserData

例如:


感谢您的评论,但我在问题中粘贴的脚本不是UserData脚本,而是一个调用“run_instances()”的Python脚本。我还没有粘贴我的UserData脚本,它实际上是一个shell脚本,具有#/顶部的bin/bash行。当我通过控制台启动一个实例时,该脚本可以完美地工作。我就是无法让调用“run_instances()”的Python脚本传入文件。我们几乎不可能对一个未实际发布的脚本提供帮助。祝你好运伙计们,这不是我要帮助的。我现在要添加它,但我正在请求来自boto3库的Python命令帮助。这个脚本文件是通过
run\u instances()
复制到实例上的?验证它是否在
/var/lib/cloud/instance id/user data.txt
中可用。感谢您的评论。不,那个文件是空的。这是我的问题。我不知道如何格式化命令,以便传入包含用户数据的文件。理论上,当从命令行运行“file://”指令时,可以使用该指令完成此操作。我找不到任何说明如何从Python中执行此操作的文档。您能以这种方式传递它吗
file:///C:/Users/xxxxx/Dev/Site%20Where%20My 脚本%20Is/base\u server\u bootstrap.sh
并查看它是否工作感谢您的建议,但也不起作用。@A.Rodell实例启动后,如果您转到aws控制台,右键点击实例,实例设置->查看用户数据,你看到了什么?
#cloud-config
ec2client.run_instances(,...,UserData=open("C:\\Users\\xxxxx\\Dev\\Site Where My Script Is\\base_server_bootstrap.sh").read(),...)