Изменение значения переменной скрипта Bash при запуске AWS CLI - PullRequest
0 голосов
/ 12 сентября 2018

Я написал этот сценарий для захвата всех экземпляров в регионе AWS, а затем распечатки в файл AZ, VolumeId, InstanceId и Volume.Выполнение кажется плавным до строки 13. Все значения получены в соответствии с ожиданием.Я получаю instance_id требуется.Я проверил значения в переменной instance_id, используя цикл for, и у меня есть несколько идентификаторов.Когда сценарий достигает строки 14, возникает ошибка, указывающая на отсутствие идентификатора экземпляра.Команда echo показывает идентификаторы экземпляра в переменной, но команда 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

Я не в себе, пытаюсь отладить.Любая помощь будет оценена.Спасибо.

Редактировать: Итак, после нескольких часов наблюдения за ошибкой я понял, что для одного экземпляра был возвращен один идентификатор, а затем была возвращена строкакоторый имел этот идентификатор экземпляра вместе с одинарными кавычками

Произошла ошибка (InvalidInstanceID.NotFound) при вызове DescribeInstance 'не существует идентификатор экземпляра' i-02f4a ---------------

, поэтому я проверил все полученные значения, которые превышают длину идентификатора экземпляра.в соответствии с документами aws они говорят, что длина идентификатора для экземпляров фиксирована, а для i и - это 17 + 2.После проверки идентификатора экземпляра длиннее 19 мы можем использовать только идентификаторы длиной 19. Вот правильный код (для всех, кому он может понадобиться).

#!/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 голосов
/ 14 марта 2019

Аплодисменты всем, что нашли время. А также для размещения после так долго. Проблема была не с кодом. Проблема была из-за терминала gitbash. Как только я запустил свой код в терминале Ubuntu, код выполняется отлично.

0 голосов
/ 12 сентября 2018

Эта часть, я верю, поможет вам исправить ваш сценарий

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

...