问题描述
在 the example in AWS-CLI documentation 之后,我尝试使用 AWS CLI 运行 EC2 实例,但出现错误
An error occurred (InvalidParameterCombination) when calling the RunInstances operation: The parameter groupName cannot be used with the parameter subnet
与其手动提取每条信息,我认为将它们设置为环境变量然后将它们传递给 docker run
export AMI_ID=ami-0b2ca94b5b49e0132
export KEY_NAME=$(aws ec2 describe-key-pairs --query 'KeyPairs[*].KeyName | [0]' --output text)
export SG_ID=$(aws ec2 describe-security-groups --filters Name=group-name,Values="my-sg" --query 'SecurityGroups[*].GroupId | [0]' --output text)
export subnet_ID=$(aws ec2 describe-subnets --query 'subnets[*].subnetId | [0]' --output text)
export VPC_ID=$(aws ec2 describe-vpcs --query 'Vpcs[*].VpcId | [0]' --output text)
docker run --rm -it -e AMI_ID -e KEY_NAME -e SG_ID -e subnet_ID -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli ec2 run-instances --image-id ${AMI_ID} --count 1 --instance-type t2.micro --key-name ${KEY_NAME} --security-group-ids ${SG_ID} --subnet-id ${subnet_ID}
到目前为止我发现的其他帖子表明问题在于使用 --security-groups
参数而不是 --security-group-ids
但我已经在使用后者所以我被卡住了。
解决方法
我仍然不确定以前的语法有什么问题,但是在声明环境变量时,它们被标记为附加字符,例如开头的 $'
和结尾的 \C-M'
。
export AMI_ID=ami-0b2ca94b5b49e0132
export KEY_NAME=`aws ec2 describe-key-pairs | jq -j '.KeyPairs[0].KeyName'`
export SG_ID=`aws ec2 describe-security-groups --filters Name=group-name,Values="my-sg" | jq -j '.SecurityGroups[0].GroupId'`
export SUBNET_ID=`aws ec2 describe-subnets | jq -j '.Subnets[0].SubnetId'`
还有之前的 docker run
是臃肿的,因为在执行 docker run
之前环境变量被 shell 替换了,并且因为它们在图像中不再使用,所以它们不需要传递。所以较短的命令是
docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli ec2 run-instances --image-id $AMI_ID --count 1 --instance-type t2.micro --key-name $KEY_NAME --security-group-ids $SG_ID --subnet-id $SUBNET_ID
这对我有用。