AWSのAPI操作を複数アカウントに対して行うGemをリリースしました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。望月です。
本日Gemをひとつリリースしたので、その紹介をかねたポストです。

概要

credential_traverserというGemをリリースしました。

このGemを使うと、AWSの特定のAPI操作を~/.aws/credentialに記載された全てのプロファイルに対して実施します。用途としては、例えば複数のAWSアカウントに対して「メンテナンス予告が来ているかどうかチェックしたい」や、「調子が悪いインスタンスがいないかチェックしたい」のように横断的にAPIリクエストを実行したい時などが考えられます。

利用

上述しましたが、このGemでは~/.aws/credentialsファイルを利用します。このファイルはSharedCredentialFileと呼ばれており、各種SDKで共通利用するためのクレデンシャル情報をINI形式で記載します。詳しくは以下のエントリを参照ください。 : AWSのクレデンシャルを記載するファイルの種類 | Developers.IO

たとえば以下のような内容のSharedCredentialFileを容易します。

[default]
aws_access_key_id = AKIAxxxxxxxxx
aws_secret_access_key = yyyyyyyyyyyyyyyy

[other_profile]
aws_access_key_id = AKIAiiiiiiiiiiiii
aws_secret_access_key = jjjjjjjjjjjjjjjjj

[another_profile]
aws_access_key_id = AKIAmmmmmmmmmmmm
aws_secret_access_key = nnnnnnnnnnnnnn

全部で3つのプロファイルが記載されています。そして動作確認用に以下のRubyコードを準備します。

require 'aws-sdk-v1'
require 'credential_traverser'

CredentialTraverser.traverse do |profile|
    ec2 = AWS::EC2.new
    puts "#{profile} : #{ec2.instances.count}"
end

EC2インスタンスの数を数えるだけの簡単なスクリプトです。SharedCredentialFileに記載された全てのクレデンシャル情報に対して、ブロックとして渡された5,6行目が実行されます。
実行結果は以下のようになります。

default : 5
other_profile : 2
another_profile : 0

全てのプロファイルを利用して、インスタンス数を数えてくれました。

まとめ

弊社では一つのプロジェクトに対して一つのAWSアカウントを作成するやり方を推奨しています。例えば開発環境と本番環境のAWSアカウントを分割することで、環境の隔離性が保たれ、様々な事故の可能性が減るからです。ただ、AWSアカウントの数が増えれば増えるほど、AWSアカウントとアカウント内のサービスの状況を把握し、きっちりと運用することが困難になります。そんな時のために、アカウントが増えても管理コストが増えないよう、様々な自動化の仕組みがあると便利ですよね。ぜひご利用下さい。PullRequestもお待ちしております。