2021/06/21

「AWS SDK for Ruby」を使ってAWSサービスを管理する方法

 
  

AWS SDK for Rubyとは?


AWSには、豊富なサービスを操作するためのAPIが用意されており、そのAPIを簡単に利用するために様々なプログラミング言語ごとにSDKが提供されています。

AWS SDK for Rubyもその内の一つで、Ruby言語を用いてAPIを操作し、AWSのサービスへのアクセスが可能になります。因みにこのSDKは他に、C++、Go、Java、JavaScript、.NET、Node.js、PHP、Pythonのものが提供されています。

AWS SDK for Rubyで何ができるのか?

具体的に、AWS SDK for Rubyを使ってどのようなことができるのか、例を挙げてご紹介します。

例えば、仮想サーバサービスのEC2について言うと、インスタンスの作成・起動・削除などを行ったり、セキュリティグループを管理したりできます。

また、オンラインストレージサービスのS3では、バケットに対する様々な操作が可能です。こちらについては、後ほど手順を詳しく見ていきます。

更には、データベースサービスのRDSにおいてスナップショットを取得したり、システム監視サービスのCloudWatchでアラームを作成したり、といった操作も可能です。

AWS SDK for Rubyのセットアップ


AWS SDK for Rubyを利用するためのセットアップを行っています。手順としては、AWS SDK for Rubyをインストールしたあと、各種設定という流れになります。

AWS SDK for Ruby のインストール

RubyのプロジェクトがBundlerを使用している場合は、Gemfileに「gem ‘aws-sdk’」の一行を追加し、Bundlerを使用していない場合は、次のコマンドを実行してAWS SDK for Rubyをインストールします。

sudo gem install aws-sdk

なお、SDKはAWSのサービスを網羅できるように100以上のGemが用意されており、通常はこれら全てがインストールされます。

利用したいサービスに絞ってインストールしたい場合、AWS SDK for Rubyの最新バージョンであるVersion3からは、SDKがモジュール化されており個別にインストールできるようになっています。

例えば、S3とEC2のみをインストールしたい場合は、Gemfileに以下のように記述します。

gem 'aws-sdk-s3'
gem 'aws-sdk-ec2'

因みに、AWSのサービスとGemの名前の対応関係はこちらから確認できます。

AWS SDK for Ruby の設定

AWSのサービスやリソースにアクセスするためのクレデンシャル(認証)情報を設定します。

Linuxであれば「~/.aws/credentials」に、Windowsであれば「%HOMEPATH%\.aws\credentials」にあるAWS認証情報プロファイルに、以下のように設定します。

[default]
aws_access_key_id = {アクセスキー}
aws_secret_access_key = {シークレットアクセスキー}

AWS SDK for Rubyの実行


AWS SDK for Rubyの実行には、「Client API」と「Resource API」という2種類のインターフェイスが存在します。大まかには同じことができますが、以下のような違いがあります。

細かいことまで実行できるClient API

Client APIは、API単位でメソッドが提供されており、「Aws::XXX::Client(XXXは各サービス名)」という形で記述します。

例えば、S3のバケットを作成するコードは以下のようになります。

s3 = Aws::S3::Client.new(region: 'region', access_key_id: 'xxxxxx', secret_access_key: 'xxxxxx')
s3.create_bucket(bucket: bucket)

作成したバケットにオブジェクト(ファイル)をアップロードします。put_objectメソッドを呼び出して、[bucket]にバケット名、[key]にファイル名を指定し、[body]にはFileクラスのインスタンスを指定するか、ファイルのデータを表す文字列を指定します。

s3.put_object(bucket: bucket, key: "file1.txt", body: File.open("file1.txt")

バケット内のオブジェクトを一覧表示します。list_objects_v2メソッドを呼び出すと、バケット内のオブジェクトを表すインスタンスが返されます。続けて、ListObjectsV2Outputクラスのcontentsメソッドを使用して、各オブジェクトのプロパティにアクセスします。

resp = s3.list_objects_v2(bucket: bucket)
resp.contents.each do |obj|
  puts obj.key
end

Client APIは、APIとメソッドが1対1で対応しているため、1処理ごとにコードを記述する必要があり、情報の取得も少し複雑ではあるものの、細かく柔軟な処理が記述できるというメリットがあります。

直感的に使えるResource API

Resource APIは、内部的にClientをラップしたもので、「Aws::XXX::Resource」という形で記述します。オブジェクト指向で処理を記述できます。

Client APIのコード例と同じように、S3バケットの作成から見ていきましょう。作成したS3リソースに対して、createメソッドを呼び出します。

s3 = Aws::S3::Resource.new(region: 'region', access_key_id: 'xxxxxx', secret_access_key: 'xxxxxx')
my_bucket = s3.bucket('bucket').create

作成したバケットにオブジェクト(ファイル)をアップロードします。putメソッドを呼び出して、バケットにファイルを追加します。

S3.object('file1.txt').put(body: File.open('file1.txt'))

upload_fileメソッドを呼び出して、マルチアップロードも可能です。

S3.object('file1.txt').upload_file('file1.txt')

バケット内のオブジェクトを一覧表示します。Bucket:Objectメソッドを呼び出すと、バケット内のオブジェクトにアクセスできます。

my_bucket.objects.each do |obj|
  puts obj.key
end

Resource APIは、Client APIに比べて細かな独自処理を記述することはできませんが、複数の処理をまとめて記述できたり、直感的に利用できるといったメリットがあります。

AWS SDK for Rubyを使ってみよう


この記事では、AWSのサービスやリソースを操作するためのAPIをRuby言語から利用する手段として、AWS SDK for Rubyについて解説しました。

AWS SDK for Rubyには、細かく柔軟な処理を記述できるClient APIと、直感的に処理を記述できるResource APIという2種類のインターフェイスが備わっており、S3のオブジェクト操作を例に取って、これらの違いについても解説しました。

最初のうちは、2つのインターフェイスの違いを意識するのは難しいかもしれませんが、徐々に両者を使い分けられるようになります。

今回はS3を例に解説しましたが、AWS SDK for RubyはEC2やRDSなどあらゆるサービス、リソースに対する操作が可能ですので、是非色々試してみてください。