簡體   English   中英

運行AWS CLI時更改Bash腳本變量值

[英]Bash script variable value changing when running 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和單引號的字符串。

調用DescribeInstance時不存在錯誤(InvalidInstanceID.NotFound)實例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

謝謝大家的幫助。

我相信這部分將幫助您更正腳本

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

道歉大家花時間。 而且還可以發布這么長時間。 問題不在於代碼。 問題出在gitbash終端。 一旦我在ubuntu終端中運行代碼,代碼就會完美執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM