AWS Command Line Interface (CLI) 출력을 `--query`로 제어하고 파이프 라인에서 활용



이것을
% aws organizations describe-organization
{
    "Organization": {
        "MasterAccountEmail": "[email protected]",
        "MasterAccountArn": "arn:aws:organizations::111111111111:account/o-xxxxxxxxxx/111111111111",
        "MasterAccountId": "111111111111",
        "Id": "o-xxxxxxxxxx",
        "AvailablePolicyTypes": [
            {
                "Status": "ENABLED",
                "Type": "SERVICE_CONTROL_POLICY"
            }
        ],
        "FeatureSet": "ALL",
        "Arn": "arn:aws:organizations::111111111111:organization/o-xxxxxxxxxx"
    }
}

이렇게 하는 이야기입니다
% aws organizations describe-organization --query 'Organization.MasterAccountEmail' --output text
[email protected]

그리고 예를 들면 이렇게 적용
% aws ec2 describe-regions --query 'Regions[].{Name:RegionName}' --output text | xargs -I{} aws ec2 describe-availability-zones --region {} --query 'AvailabilityZones[].{c1:RegionName,c2:ZoneName,c3:State}' --output text
eu-north-1      eu-north-1a     available
eu-north-1      eu-north-1b     available
eu-north-1      eu-north-1c     available
ap-south-1      ap-south-1a     available
ap-south-1      ap-south-1b     available
...(省略)
  • ※전 지역 전 AZ 열거

  • 왜 awscli --query 옵션을 고집하는가? 먼저 JSON 구문 분석을 일부 도구에 의존하고 싶지 않기 때문입니다.
    jq 은 이마이치이고, JSON 어째서 JavaScript로 쓰는 것이 가장 자연스러운 생각은 하지만, Node.js 로 실제로 해 보면 이것은 이것으로 귀찮게 느껴 버린다.

    첫 번째 describe-organization 자바 스크립트를 사용한다면 이런 느낌입니까?
    % aws organizations describe-organization | node -e "
      const data = [];
      process.stdin
        .on('readable', () => {
          let chunk;
          while ((chunk = process.stdin.read()) !== null) {
            data.push( chunk );
          }
        } )
        .on('end', () => {
          process.stdout.write( JSON.parse( data.join( '' ) ).Organization.MasterAccountEmail );
        } );
    "
    

    readline 그렇다면 이런 느낌인가
    % aws organizations describe-organization | node -e "
      const data = [];
      require( 'readline' )
        .createInterface( { input: process.stdin } )
        .on( 'line', ( l ) => {
          data.push( l );
        } )
        .on( 'close', () => {
          process.stdout.write( JSON.parse( data.join( '' ) ).Organization.MasterAccountEmail );
        } );
    "
    

    역시 --query 파라메타로 하는 것이 편한 생각이 듭니다. 이점은 다음과 같은 느낌입니까?
  • 기타 도구 독립적
  • 매개 변수를 고안 할 필요는 있지만 비교적 낮은 부담으로 전망 할 수 있습니다
  • --output text와의 조합으로 이후의 처리에도 파이프로 연결하기 쉽다
  • ※ 경우에 따라서는 --filters 도 유용

  • 원래 이러한 출력 제어라고 하는 것은, 본질적으로 노력하고 싶은 처리가 아니기 때문에, 최대한 최소화시키고 싶은 것입니다
    최소화하면, 작은 처리를 조합한 복잡한 것도 보다 쓰기 쉬워집니다

    organizations 하지만
    aws organizations list-accounts --query 'Accounts[].{Id:Id,Name:Name}' --output text | while read a; do printf "$a\n"; aws organizations list-tags-for-resource --resource-id "`echo $a | awk '{print $1}'`" --query 'Tags[].{Key:Key,Value:Value}' --output table; done
    
  • ※모든 멤버 계정 태그 열거
  • ※ 마스터 계정으로 작동합니다

  • 궁리 나름으로 여러가지 활용할 수 있습니다만, 리전이나 계정을 횡단한 조직 통제계의 오퍼레이션등도, 일부러 브라우저에 갈 것도 없고, 이렇게 빨리 CLI로 하면 즐겁습니다.

    좋은 웹페이지 즐겨찾기