こんにちは。インフラ部の齋藤(@sri_1128)です。
今回はAWSのAPIを扱うときにLINQPadを使うと何かと便利です。 という話をしたいと思います。
AWS APIの便利さと複雑さ
普段、Windows環境でAWSのAPIを叩くときには、CUIで扱う場合にはAWS Tools for Windows PowerShell、C#から扱う場合にはAWS SDK for .NETを使います。 Windows環境からでも全く問題なく扱えますし、新サービス等への追従も早く、仕事をする上で欠かせない便利な存在です。いつもお世話になっております。
しかし一方で、APIのRequestに使うクラスやResponseで返ってくるクラスって結構ネストが深かったり複雑で、パッと見だとどう扱うべきなのか分かりづらいデータ構造になっているものが多いと感じます。 EC2インスタンス名の一覧を取得する。のような一見シンプルな操作だけでも意外とレスポンスの中身を掘っていかないとたどり着かないので、 ちょっと何かしたいだけなんだけど意外と苦戦した。という経験を持っている方も少なくないんじゃないでしょうか?
ただ、これはそもそもAWSのサーバーやサービスの状態が細かく扱える便利さ故の複雑性だと思うので、これはもうそんなものと考えるべきなのかな。とは感じます。
とはいえ、複雑なものは複雑なのでどうしたものかなというのはあるのですが、私はLINQPadに非常に助けられています。
LINQPadって?
LINQPadに関しては下記の記事が良くまとまってます。
要は軽量なC#/F#/VB等のエディタ/実行環境なのですが、
- InteliSense likeな優れた入力補完
- オブジェクトの構造を綺麗に整形して出力するDumpメソッド
- NuGetによるパッケージ管理
等、小さいコードを書いてTry&Errorするのに非常に便利な機能を持ったツールです。
無料版だとコア機能がかなり制限されてしまってうーん。。といった感じになってしまうので、 もし継続的に使用するのであれば有料版がオススメです。
個人的にはこの便利さを得られるのであれば、全然悪くない買い物だと思っています。 グラニでは愛用者が多いこともあり、Enterprise License($950.00 - Premium Editionでインストールユーザー数無制限)を購入しています。(ということもあり、本記事でも有料版が前提です)
LINQPadでEC2インスタンスの情報を取得する
では実際にLINQPadを使ってEC2インスタンスの情報を取得してみましょう。
まず、LINQ Padを立ち上げQueryのLanguageをC# Programに変えて下記のようなコードを書きます。
void Main() { // accessKeyIdとsecretAccessKeyは適当なものに変更してください。 var accessKeyId = "hoge"; var secretAccessKey = "huga"; var ec2Client = new AmazonEC2Client(accessKeyId, secretAccessKey, RegionEndpoint.APNortheast1); var response = ec2Client.DescribeInstances(); response.Dump(); //DescribeInstanceResponseの中身を見る }
次に、LINQPadの機能の一つであるNuGet Managerを使用し、AWSSDKパッケージをインストールしましょう。
F4を押すとQueryのプロパティが開くので、AddNuGetからNuGet Managerを開きましょう。 開いたら、AWSSDK - Amazon Elastic Compute Cloudのパッケージを検索し、Add To Queryしましょう。
SDKを入れたらnamespaceをインポートしましょう。 インポートはプロパティでもできますが、コード上で赤くなってるクラス名にカーソルをあて「Ctrl + . 」すると候補が出るので、これを使ったインポートがお手軽でオススメです。
namespaceがインポートできたらコードを実行する準備は完了です。F5を押し実行してみましょう。 するとDescribeInstancesが実行され、戻り値であるDescribeInstancesReponseクラスの中身がDumpメソッドにより出力されます。
この出力結果から、 DescribeInstancesResponseには何個かプロパティがあって、Reservationsっていうプロパティに何かEC2の情報っぽいのが詰まっていて、それ自体もListになってて、更にInstancesっていうプロパティもListになってて…あーこのプロパティからこの値取れるんだーといった感じでAPIレスポンスの全体像を視覚的に把握することができます。便利ですね。
実際には生のレスポンスを扱わないで整形して使うことがほとんどだと思うので、 各EC2のインスタンスID、プライベートIP、起動状態を配列として取得する。という条件で試してみましょう。
void Main() { var accessKeyId = "hoge"; var secretAccessKey = "huga"; var ec2Client = new AmazonEC2Client(accessKeyId, secretAccessKey, RegionEndpoint.APNortheast1); var response = ec2Client.DescribeInstances(); var result = response .Reservations .SelectMany(x => x.Instances) .Select(x => new { x.InstanceId, x.PrivateIpAddress, State = x.State.Name.Value.ToString() }) .ToArray(); result.Dump(); }
結果としては下記のようになります。 モザイクモザイクしててなんのこっちゃって感じですが、InstanceIdとPrivateIpが表示されています。(短そうなインタンスIDがあるのはご愛嬌)
こんな感じで何か特定の情報を取ってきたい。となったときも、 Dumpの結果からどんな構造になってるか分かるし、わからなくなってもDumpの結果を見ながらコードを書けばいいので、非常に簡単です。 Reservationsから引っ張ってくるのもSelectManyで平坦化する必要があるのも、中々一発で書くのは難しいですが、これならすぐに書けます。
APIリストを確認する
LINQPadの優秀な入力補完機能が利いてくれるため、そのクラスで扱えるメソッド一覧が全て候補して表示されます。
メソッド一覧は実質の扱えるAPIの一覧なので、この候補を見ることにより APIで何ができるのか、どんな値をパラメータとして渡す必要があるかということを把握することができます。 シンプルなものであれば、ドキュメントを読まなくてもこれだけでAPIを叩けるのでこちらも便利です。
まとめ
LINQPad便利です。そして複雑なデータ構造を持っているAWS APIと非常に相性が良いと思います。 AWSの進化は目覚ましく、新しい製品も続々とでてきます。使ったことのないAPIを叩く機会も多いでしょう。 そんな時にLINQPadを使うことで理解の手助けになるのではないでしょうか。