ぶろとよ

ネットワーク系クラウドエンジニア(AWS)の技術ブログ。自動化に興味があるためAWS CLIを勉強&アウトプット中。

AWS CLI:PowerShellのFor文で、EC2に絡む設定をまとめてインスタンス毎にテキスト出力する。

この記事でやったこと

  • 全EC2インスタンスのIDを変数へ格納する。
  • 変数(リスト)内の区切り文字が空白なのを、改行区切りにする。
  • PowerShell For文でインスタンス毎にテキスト出力する。
    • 以下のコマンド結果を1つのファイルへ出力する。

      aws ec2 describeinstances
      aws ec2 describevolumes (複数あることを考慮してFor文利用 )
      aws ec2 describenetworkinterfaces (複数あることを考慮してFor文利用 )
      aws ec2 describesecuritygroups (複数あることを考慮してFor文利用 )
      aws ec2 describeimages

目次

検証環境

  • 検証日: 2021/10/30
  • PC環境:
    • Windows10 Home Ver21H1
      • PowerShell: Ver7.1.5
      • AWS CLI: aws-cli/2.1.34 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
        • -- profile default : 読み取り専用
        • -- profile aws_RW : 書き込み権限あり
          • ※ 誤操作防止のため、変更操作時のみ-- profileオプション付与。
        • -- profile aws_PF : SystemsManagerポートフォワーディング用

注意事項

  • 本記事の内容はWindows PowerShellで検証しています。
  • AWS CLIはバージョン2を使用しています。
    • 本記事のコマンド出力でYAMLを使用してますが、これはバージョン2の機能です。
  • コマンド内の変数やパラメータやは検証で使用したものを記載しています。ご自身の環境に合わせ、書き換えて使用してください。
  • 個人で検証しているため実行結果に責任は持てません。必ずご自身でも検証してから使用してください。


1. 全EC2インスタンスのIDを変数へ格納する

## 全EC2のIDを変数へ格納
${ec2_id} = aws ec2 describe-instances `
    --query "Reservations[].Instances[].InstanceId" `
    --output text `
    ; ${ec2_id}

## < 出力例 >
i-1234567890AAAAAAA     i-1234567890BBBBBBB     i-1234567890CCCCCCCC


2. 変数内の区切り文字を変更(空白 > 改行)

## 変数内の区切り文字を変更(半角空白 > 改行)
##   [-split]のデフォルトは半角空白を改行へ。その他例: [-split ":"] [-split ","]
${ec2_id_split} = -split ${ec2_id} `
    ; ${ec2_id_split}

## < 出力例 >
i-1234567890AAAAAAA
i-1234567890BBBBBBB
i-1234567890CCCCCCCC


3. For文でインスタンス毎にテキスト出力する

EC2インスタンス毎に以下コマンドの結果を1つのファイルへ出力します。

aws ec2 describeinstances
aws ec2 describevolumes (複数あることを考慮してFor文利用 )
aws ec2 describenetworkinterfaces (複数あることを考慮してFor文利用 )
aws ec2 describesecuritygroups (複数あることを考慮してFor文利用 )
aws ec2 describeimages


ファイル名には「EC2インスタンスNameタグ」を含めてファイル出力します。
※拡張子はymlにしていますが、JSON利用時はjsonへ修正してください。

20211030-091354_EC2インスタンスNameタグ_ec2-setting-information.yml


## 変数設定
##     出力フォルダは ${work_dir} で指定
${datetime} = Get-Date -Format yyyyMMdd-HHmmsss
${work_dir} = "C:\#temp"

## 出力フォルダ ${work_dir} を開く
Invoke-Item ${work_dir}

## For文でインスタンス毎にYAMLファイルを出力
foreach (${instances} in ${ec2_id_split}) {
    # EC2 instances
    ${ec2_name} = aws ec2 describe-instances `
        --instance-ids ${instances} `
        --query "Reservations[].Instances[].Tags[?Key=='Name'].Value" `
        --output text

    Write-Output "# --- aws ec2 describe-instances ------" `
    | Out-File -Encoding ascii ${work_dir}\${datetime}_${ec2_name}_ec2-setting-information.yml

    aws ec2 describe-instances `
        --instance-ids ${instances} `
    | Out-File -Append -Encoding ascii ${work_dir}\${datetime}_${ec2_name}_ec2-setting-information.yml

    # EBS, volume, For文利用(複数Attach考慮)
    Write-Output "# --- aws ec2 describe-volumes ------" `
    | Out-File -Append -Encoding ascii ${work_dir}\${datetime}_${ec2_name}_ec2-setting-information.yml

    ${volume_id} = aws ec2 describe-instances `
        --instance-ids ${instances} `
        --query "Reservations[].Instances[].BlockDeviceMappings[].Ebs[].VolumeId" `
        --output text

    ${volume_id_split} = -split ${volume_id}

    foreach (${volume} in ${volume_id_split}) {
        aws ec2 describe-volumes `
            --volume-ids ${volume} `
        | Out-File -Append -Encoding ascii ${work_dir}\${datetime}_${ec2_name}_ec2-setting-information.yml
    }

    # ENI, Elastic Network Interfaces, For文利用(複数Attach考慮)
    Write-Output "# --- aws ec2 describe-network-interfaces ------" `
    | Out-File -Append -Encoding ascii ${work_dir}\${datetime}_${ec2_name}_ec2-setting-information.yml

    ${interface_id} = aws ec2 describe-instances `
        --instance-ids ${instances} `
        --query "Reservations[].Instances[].NetworkInterfaces[].NetworkInterfaceId" `
        --output text

    ${interface_id_split} = -split ${interface_id}

    foreach (${interface} in ${interface_id_split}) {
        aws ec2 describe-network-interfaces `
            --network-interface-ids ${interface} `
        | Out-File -Append -Encoding ascii ${work_dir}\${datetime}_${ec2_name}_ec2-setting-information.yml
    }

    # SGR, SecurityGroup, For文利用(複数Attach考慮)
    Write-Output "# --- aws ec2 describe-security-groups ------" `
    | Out-File -Append -Encoding ascii ${work_dir}\${datetime}_${ec2_name}_ec2-setting-information.yml

    ${sgr_id} = aws ec2 describe-instances `
        --instance-ids ${instances} `
        --query "Reservations[].Instances[].SecurityGroups[].GroupId" `
        --output text

    ${sgr_id_split} = -split ${sgr_id}

    foreach (${sgr} in ${sgr_id_split}) {
    aws ec2 describe-security-groups `
        --group-ids ${sgr} `
        | Out-File -Append -Encoding ascii ${work_dir}\${datetime}_${ec2_name}_ec2-setting-information.yml
    }

    # AMI, Amazon Machine Image, 単一のためFor文無し
    Write-Output "# --- aws ec2 describe-images ------" `
    | Out-File -Append -Encoding ascii ${work_dir}\${datetime}_${ec2_name}_ec2-setting-information.yml

    ${image_id} = aws ec2 describe-instances `
        --instance-ids ${instances} `
        --query "Reservations[].Instances[].ImageId" `
        --output text

    aws ec2 describe-images `
        --image-ids ${image_id} `
        | Out-File -Append -Encoding ascii ${work_dir}\${datetime}_${ec2_name}_ec2-setting-information.yml

}