Amazon web services “如何复制ec2”;推出更像这样的产品;从命令行?

Amazon web services “如何复制ec2”;推出更像这样的产品;从命令行?,amazon-web-services,amazon-ec2,Amazon Web Services,Amazon Ec2,aws ec2界面有一个名为“launch more like this”的按钮,用于启动第二个实例(如所选实例)。据我所知,aws命令行界面中没有类似的功能。像这样启动是一个向导,没有与之相当的CLI。您需要获取第一个实例属性,并使用它们来启动具有相同属性的第二个实例(实例唯一的属性除外)。将--clone选项添加到awscli。请查看。这可能不是您要寻找的答案,但如果您可以使用描述您的初始实例,则可以使用以下方法创建更类似的实例: aws cloudformation create-stac

aws ec2界面有一个名为“launch more like this”的按钮,用于启动第二个实例(如所选实例)。据我所知,aws命令行界面中没有类似的功能。

像这样启动是一个向导,没有与之相当的CLI。您需要获取第一个实例属性,并使用它们来启动具有相同属性的第二个实例(实例唯一的属性除外)。将--clone选项添加到awscli。请查看。

这可能不是您要寻找的答案,但如果您可以使用描述您的初始实例,则可以使用以下方法创建更类似的实例:

aws cloudformation create-stack --region your-region --template-body file://path-to-your-instance-description.json stack-name-must-be-unique
以下是一种将实例构建为另一个实例副本的可行(尽管有些老套)方法:

function cloneinstance {
  awsinstanceid=$1
  region=$2
  export AWS_DEFAULT_REGION=$region
  ami=$(aws ec2 describe-instances --instance-ids $awsinstanceid | grep INSTANCES | awk '{print $7}')
  privatekey=$(aws ec2 describe-instances --instance-ids $awsinstanceid | grep INSTANCES | awk '{print $10}')
  securitygroup=$(aws ec2 describe-instances --instance-ids $awsinstanceid | grep SECURITYGROUPS | awk '{print $2}')
  instancetype=$(aws ec2 describe-instances --instance-ids $awsinstanceid | grep INSTANCES | awk '{print $9}')
  subnet=$(aws ec2 describe-instances --instance-ids $awsinstanceid | grep NETWORKINTERFACES | awk '{print $9}')

  awsinstancedata=$(aws ec2 run-instances --image-id $ami --key-name $privatekey --security-group-ids $securitygroup --instance-type $instancetype --subnet-id $subnet)
  awsinstanceid=$(echo $awsinstancedata | awk '{print $9}')

  # AWS CLI sucks and doesn't return error codes so have to look for a valid id
  if [[ "$awsinstanceid" == i-* ]]; then echo -e "\t\tSuccessfully created. Instance ID: $awsinstanceid"; else echo -e "\t\tSomething went wrong. Check your configuration."; exit 1; fi 
  echo -e "\t\tWaiting for it to come up..."
  aws ec2 wait instance-running --instance-ids $awsinstanceid
  echo -e "\t\tServer is up and ready"
}

cloneinstance i-12345678 us-west-1

第一条评论很有效。但对于上瘾,我添加了一个使用powershell core的替代方案

function LaunchMoreLikeThis ([String]$SourceInstanceName, [String]$CloneInstanceName, [String]$AMI_ID, [String]$InstanceType, [Int64]$Count = 1) {
 $SourceInstance = aws ec2 describe-instances --filters "Name=tag:Name,Values=$SourceInstanceName"
 $SourceInstance = $SourceInstance -join '' | ConvertFrom-Json -Depth 99

 $SourceInstanceAttr = $SourceInstance.Reservations.Instances[0];
 $InstanceId = $SourceInstanceAttr.InstanceId
 $SGs = $SourceInstanceAttr.SecurityGroups.GroupId | ForEach-Object { "`"$_`"" } | Join-String -Separator ' '  ;
 $PrivateKey = $SourceInstanceAttr.KeyName
 $SubnetId = $SourceInstanceAttr.SubnetId
 $UserData = pwsh -nologo -command "aws ec2 describe-instance-attribute --instance-id $InstanceId --attribute userData"
 $UserData = $UserData -join '' | ConvertFrom-Json -Depth 99
 $UserDataDecoded = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData.UserData.Value))
 $UserDataFile = New-item -ItemType File -Path $([IO.Path]::GetTempPath()) -Name "user_data" -Value $UserDataDecoded -Force #You can change this to use a different user_data
 $Tags = "ResourceType=instance,Tags=[{Key=Name,Value=$CloneInstanceName}]"
 pwsh -nologo -command "aws ec2 run-instances --image-id $AMI_ID --instance-type $InstanceType --security-group-ids $SGs --count 1 --subnet-id $SubnetId --key-name $PrivateKey --user-data file://$($UserDataFile.FullName) --tag-specifications `'$Tags`'"

}

LaunchMoreLikeThis -SourceInstanceName "<source_instance_name>" -CloneInstanceName "<clone_instance_name>" -AMI_ID "<ami_id>" -InstanceType "t3.medium"
函数LaunchMoreLikeThis([String]$SourceInstanceName,[String]$CloneInstanceName,[String]$AMI\u ID,[String]$InstanceType,[Int64]$Count=1){
$SourceInstance=aws ec2描述实例--过滤器“名称=标记:名称,值=$SourceInstanceName”
$SourceInstance=$SourceInstance-加入“”| ConvertFrom Json-深度99
$SourceInstanceAttr=$SourceInstance.Reservations.Instances[0];
$InstanceId=$SourceInstanceAttr.InstanceId
$SGs=$SourceInstanceAttr.SecurityGroups.GroupId | ForEach对象{“`$\u```}|连接字符串-分隔符“”;
$PrivateKey=$SourceInstanceAttr.KeyName
$SubnetId=$SourceInstanceAttr.SubnetId
$UserData=pwsh-nologo-command“aws ec2描述实例属性--实例id$InstanceId--属性UserData”
$UserData=$UserData-加入“”|从Json转换-深度99
$UserDataDecoded=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData.UserData.Value))
$UserDataFile=New item-ItemType File-Path$([IO.Path]::GetTempPath())-Name“user_data”-Value$UserDataDecoded-Force#您可以将其更改为使用不同的用户_数据
$Tags=“ResourceType=instance,Tags=[{Key=Name,Value=$CloneInstanceName}]
pwsh-nologo-command“aws ec2运行实例--映像id$AMI\u id--实例类型$InstanceType--安全组id$SGs--计数1--子网id$SubnetId--密钥名$PrivateKey--用户数据文件://$($UserDataFile.FullName)--标记规范“$Tags`”
}
LaunchMoreLikeThis-SourceInstanceName”“-CloneInstanceName”“-AMI_ID”“-InstanceType“t3.medium”

在我的例子中,我需要提供一个不同的AMI,但是您可以从实例中提取它。在我的示例中,我也提取了用户数据。

helloV,我在您发送的链接中尝试了该工具,但尽管它将一些属性从一个实例复制到另一个实例,但“像这样启动”我仍然给了我不同的行为。如果可以将其更改为更紧密地复制向导,那么修改和扩展它可能是值得的。在所有相关位置添加
--输出文本
可能是一个好主意-默认值是JSON,很多人不会更改它。