AWSの全てのRDSについているタグを全て取得 PowerShell編
全てのRDSについて、タグ情報の一覧を作成したい、というときのお話です。
まあAWSのWeb画面で1つずつ見ていくのでも良いですが、RDSが20も30も、さらに多く存在すると、気が滅入りますね。
そこで、AWS CLIを使って実施します。
EC2の場合
ECSの一覧は
aws ec2 describe-instances
のコマンドで、1回で全EC2のタグ情報を拾うことができます。
RDSの場合
RDSの一覧は、
aws rds describe-db-instances
のコマンドで一覧は取得できます。
ただし、そこにはタグ情報は含まれていません!
[2021/7/11更新]
気が付いたら describe-db-instances に TagList が含まれるように変わっていました。
AWS CLIではいつから変わったのかログが無いですが、LambdaのPython(boto3)では日次で取得していたので結果を確認すると、2021/1/8 からTagListが含まれていました。
この記事は不要になりましたが、list-tags-for-resource でも取得は一応可能なので残しておきます。
RDSのタグ情報を取得する場合、個々のRDSに対して
aws rds list-tags-for-resource --resource-name arn:aws:rds:xxx:xxx:db:xxxx
を実行しないと取り出せませんでした。
よって、RDSが20個あると、
- aws rds describe-db-instances が1回
- aws rds list-tags-for-resource が20回
合計21回実行することになります。
PowerShellコード
PowerShellのコードで書くと、以下のような感じです。
$rdsfile = "C:\temp\rds.txt"
$rdsfile_tag = "C:\temp\rds_tag.txt"
$region = "ap-northeast-1"
$accountid = "99876543210x"
aws rds describe-db-instances --region=$region --query "DBInstances[].{DBInstanceIdentifier:DBInstanceIdentifier}" --output text | Sort-Object > $rdsfile
foreach ($li in Get-Content $rdsfile) {
$out_line = "$li"
$tags = $(aws rds list-tags-for-resource --resource-name $("arn:aws:rds:${region}:${accountid}:db:" + $($li -split "\t")[0]) --output text)
foreach ($othertag in ($tags | sls ^TAGLIST)) {
$t_1,$t_name,$t_val = $othertag -split "\t"
$out_line += "`t$t_name=$t_val"
}
echo "$out_line" >> $rdsfile_tag
}
$rdsfile_tag 変数で指定したファイルが生成されます。
ファイルの形式は、TSV(タブ区切りのテキストファイル)です。
なんでTSVなんだよ。
ということでjsonを出力するならこのようになります。
$rdsfile = "C:\temp\rds.json"
$rdsfile_tag = "C:\temp\rds_tag.json"
$region = "us-east-1"
$accountid = "99876543210x"
aws rds describe-db-instances --region=$region --query "DBInstances[].{DBInstanceIdentifier:DBInstanceIdentifier}" --output json > $rdsfile
$outobj = @()
$rds_instances=$(cat $rdsfile -Raw | ConvertFrom-Json)
foreach( $item in $rds_instances ) {
$arn = "arn:aws:rds:${region}:${accountid}:db:" + $item.DBInstanceIdentifier
$rds_tags = $( $(aws rds list-tags-for-resource --resource-name $arn --output json) -join "" | ConvertFrom-Json)
$rdsobj = [PSCustomObject] @{ DBInstanceIdentifier = $item.DBInstanceIdentifier }
foreach( $tag in $rds_tags.TagList ) {
$rdsobj | Add-Member $tag.Key $tag.Value
}
$outobj += $rdsobj
}
$outobj | ConvertTo-Json -compress > $rdsfile_tag
全てのRDSと書きましたが、不正確でした。1つのリージョン内の全てのRDSです。
gist
- リストの1行目にヘッダを付ける
- 一部の指定したタグは除外する
- 一部の指定したタグ指定した順で表示する
このあたりを考慮したコードをgistに置いています。
https://gist.github.com/hayayu0/f067ccbbabaa3dc0d9121aa3eadbf322
PowerShell編以外は?
PowerShellで自分の要望は満たせたので、今のところ記事作成予定はありません。じゃあ何で「編」付けたんだよって話ですが。
bash、Python、は探せばいくつかありそうです。
参考にした情報
Author And Source
この問題について(AWSの全てのRDSについているタグを全て取得 PowerShell編), 我々は、より多くの情報をここで見つけました https://qiita.com/hayayu0/items/92e2c28c34f298eb8827著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .