AWS CLI で出力した YAML を CSV に変換してみた

例えばパラメータシートとか、人が読みやすい事を意識した成果物を生成する必要があるとします。AWS のマネージメントコンソールに表示される項目をコピペして、コピペ漏れやコピペ行が間違っているとか、人が操作すると誤りが混入しやすくなります。調べると jq とか yq とか dasel とか pandoc とか色んな変換ツールはあるものの、自分がイメージしている CSV が出力できそうに無いので、簡単な Python スクリプトを作成して YAML を CSV に変換してみました。

AWS CLI で出力される YAML を確認

aws ec2 describe-vpcs \
  --region ap-northeast-2 \
  --output yaml
Vpcs:
- CidrBlock: 172.31.0.0/16
  CidrBlockAssociationSet:
  - AssociationId: vpc-cidr-assoc-032d6951af0874488
    CidrBlock: 172.31.0.0/16
    CidrBlockState:
      State: associated
  DhcpOptionsId: dopt-0b3b1a80500e95bbe
  InstanceTenancy: default
  IsDefault: true
  OwnerId: '025768214491'
  State: available
  VpcId: vpc-017618237beba3920

YAML だけでも人が読みやすいと思うのですが・・・

Python で YAML を CSV に変換するスクリプトを書く

例えば yml2csv.py というファイル名で保存します。Python で何をやっているかと言うと、インデントの深さを調べて一番深いキーの後に全ての値が出力されるように揃えているだけです。

import sys

keys = []
vals = []
maxindent = 0

for line in sys.stdin:
    line = line.strip('\n').split(':')
    key = line[0].replace('- ', ',').replace('  ', ',')
    val = line[1].replace(' ', '')
    keys.append(key)
    vals.append(val)
    if key.count(',') > maxindent:
        maxindent = key.count(',')

for i in range(len(keys)):
    indent = maxindent - keys[i].count(',')
    print('{}{},{}'.format(keys[i], ',' * indent, vals[i]))

AWS CLI が出力する YAML を CSV 出力

aws ec2 describe-vpcs \
  --region ap-northeast-2 \
  --output yaml \
  | python3 yml2csv.py > output.csv
Vpcs,,,,
,CidrBlock,,,172.31.0.0/16
,CidrBlockAssociationSet,,,
,,AssociationId,,vpc-cidr-assoc-032d6951af0874488
,,CidrBlock,,172.31.0.0/16
,,CidrBlockState,,
,,,State,associated
,DhcpOptionsId,,,dopt-0b3b1a80500e95bbe
,InstanceTenancy,,,default
,IsDefault,,,true
,OwnerId,,,'025768214491'
,State,,,available
,VpcId,,,vpc-017618237beba3920

output.csv を Numbers と Excel で開いた状態

参考

https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-vpcs.html

タグ: , ,