运行AWS CLI时更改Bash脚本变量值

时间:2018-09-12 09:34:34

标签: bash amazon-web-services aws-cli

我已编写此脚本来捕获AWS区域中的所有实例,然后将AZ,VolumeId,InstanceId和Volume大小打印到文件中。执行似乎很顺利,直到第13行。所有值都按预期收到。我得到了instance_id的要求。我已经使用for循环检查了instance_id变量中的值,并且我有多个ID。当脚本到达第14行时,将出现一个错误,提示没有实例ID。 echo命令在变量中显示实例ID,但是describe-instance命令似乎未收到该变量。 这是我的脚本:

#!/bin/bash
envs=("aws_cloud" "aws_dev" "aws_prod")
i=0
vols=""
echo "AvailabilityZone  ,   VolumeId    ,   InstanceId  ,   Size">>untagged_volumes.txt
for env in aws_cloud aws_dev aws_prod
    do
    for region in ca-central-1 us-east-1 us-west-2 eu-west-1 eu-central-1 ap-southeast-1 ap-southeast-2
    do
        instance_id=$(aws ec2 describe-volumes --profile=${env} --region=${region} --query 'Volumes[?!not_null(Tags[?Key== `Name`].Value) && (Attachments[?State!=""])].{InstanceId:Attachments[0].InstanceId}' --output text ) 
        for instance in "${instance_id}"
        do
            ec2_name=$(aws ec2 describe-instances --profile=${env} --region=${region} --instance-ids=${instance} --query 'Reservations[*].Instances[*].[Tags[?Key==`Name`].Value]' --output text)

            vol_info=$(aws ec2 describe-volumes --profile=${env} --region=${region} --filters Name=attachment.instance-id,Values=${instance} --query 'Volumes[?!not_null(Tags[?Key== `Name`].Value) && (Attachments[?State!=""])].{ID:VolumeId,InstanceId:Attachments[0].InstanceId,AZ:AvailabilityZone,Size:Size}' --output text)
            echo "${env}    ${ec2_name}""${vol_info}">>untagged_volumes.txt
        done
    done
    i=${i+1}
done

我不敢尝试调试。任何帮助,将不胜感激。谢谢。

编辑: 因此,在盯着错误看了几个小时之后,我了解到,对于一个实例,返回一个ID,然后返回一个字符串,其中包含该实例ID和单引号

  

调用时发生错误(InvalidInstanceID.NotFound)   DescribeInstance'不存在实例ID'i-02f4a ---------------

所以我检查了我得到的所有大于实例ID长度的值。根据AWS文档,他们说实例的ID长度是固定的,并且i和-为17 + 2。检查任何实例ID大于19后,我们只能使用长度为19的ID。 这是正确的代码(适用于可能需要它的任何人)。

#!/bin/bash
envs=("aws_cloud" "aws_dev" "aws_prod")
vols=""
echo "Environemnt   ,   InstanceName    ,   AvailabilityZone    ,   VolumeId    ,   InstanceId  ,   Size">>untagged_volumes.txt
for env in aws_cloud aws_dev aws_prod
    do
    for region in ca-central-1 us-east-1 us-west-2 eu-west-1 eu-central-1 ap-southeast-1 ap-southeast-2
    do
        instance_id=$(aws ec2 describe-volumes --profile=${env} --region=${region} --query 'Volumes[?!not_null(Tags[?Key== `Name`].Value) && (Attachments[?State!=""])].{InstanceId:Attachments[0].InstanceId}' --output text );
        for j in ${instance_id}
        do
            if [[ "${#j}" -gt 19 ]] || [[ "${#j}" -lt 19 ]]
            then
                continue
            else
                ec2_name=$(aws ec2 describe-instances --profile="${env}" --region="${region}" --instance-ids="${j}" --query 'Reservations[*].Instances[*].[Tags[?Key==`Name`].Value]' --output text)

                vol_info=$(aws ec2 describe-volumes --profile=${env} --region=${region} --filters Name=attachment.instance-id,Values="${j}" --query 'Volumes[?!not_null(Tags[?Key== `Name`].Value) && (Attachments[?State!=""])].{ID:VolumeId,InstanceId:Attachments[0].InstanceId,AZ:AvailabilityZone,Size:Size}' --output text)
                echo "${env}    ${ec2_name}     ""${vol_info}">>untagged_volumes.txt
            fi
        done
    done
done

谢谢大家的帮助。

2 个答案:

答案 0 :(得分:0)

我相信这篇文章会帮助您更正脚本

instance_id=$(aws ec2 describe-volumes --query 'Volumes[?!not_null(Tags[?Key== `Name`].Value) && (Attachments[?State!=""])].{InstanceId:Attachments[0].InstanceId}' --output text); for i in ${instance_id}; do aws ec2 describe-instances --instance-ids=${i};done

答案 1 :(得分:0)

道歉,每个人都在浪费您的时间。而且还可以发布这么长时间。问题不在于代码。问题出在gitbash终端。一旦我在ubuntu终端中运行代码,代码就会完美执行。