例えばパラメータシートとか、人が読みやすい事を意識した成果物を生成する必要があるとします。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
タグ: AWS, aws cli, python