【基礎から学ぶ】AWS SDK for RubyでレスポンスをスタブするPart2(引数に応じてレスポンス内容を変えてみる)

記事タイトルとURLをコピーする

前回の記事(【基礎から学ぶ】AWS SDK for Rubyでレスポンスをスタブする)ではAWS SDK for Rubyの基本的な使い方を確認しました。

今回の記事では、メソッド実行時の引数に応じてレスポンスの内容を変えてみたいと思います。

環境
  • ruby 3.1.1p18
  • aws-sdk-core (3.126.2)
  • aws-sdk-ec2 (1.299.0)

サンプルのスニペット

EC2の describe_volumesfilters により、取得内容をフィルタリングするケースを考えたいと思います。

サンプルとして "vol-11111111111111111" ボリュームのみが存在しているケースを考えます。 フィルタリングでこのボリュームIDを指定した場合のみ、レスポンスにボリュームの内容が格納され、それ以外のボリュームIDが指定された場合はレスポンスのボリュームは空であることを実現したいと思います。

例えば、以下のコードを用意した場合、

require "aws-sdk-ec2"

client = Aws::EC2::Client.new(stub_responses: true)
client.stub_responses(:describe_volumes, {
                        volumes: [
                          { volume_id: "vol-11111111111111111", state: "available" }
                        ]
                      })
response = client.describe_volumes(
  filters: [
    {
      name: "volume-id",
      values: ["vol-22222222222222222"]
    }
  ]
)
pp response.volumes # => "vol-11111111111111111" のボリュームの情報が表示される

フィルタリングのボリュームIDに存在するとしたIDとは異なるIDを指定しているため、期待としてはボリュームは空で返ってきてほしいのですが、実際には describe_volumes メソッドの返り値として "vol-11111111111111111" が返ってくるようにスタブしているため、レスポンスにこのボリュームの情報が返ってきます。

引数に応じてレスポンス内容を変えるやり方

filters で特定ボリュームIDが指定された場合のみ当該ボリューム情報を返答するように調整したいと思います。 スタブする際に stub_responses の第2引数にProcオブジェクトを渡します。 その際の引数に describe_volumes を実行した際に渡される引数が格納されるため、この引数の内容に応じてレスポンスする内容を調整します。

require "aws-sdk-ec2"

client = Aws::EC2::Client.new(stub_responses: true)
client.stub_responses(:describe_volumes, lambda do |context|
  pp context.params # => {:filters=>[{:name=>"volume-id", :values=>["vol-22222222222222222"]}]}
  if context.params[:filters][0][:name] == "volume-id" \
    && context.params[:filters][0][:values] == ["vol-11111111111111111"]
    { volumes: [
      { volume_id: "vol-11111111111111111", state: "available" }
    ] }
  else
    {
      volumes: []
    }
  end
end)

response1 = client.describe_volumes(
  filters: [
    {
      name: "volume-id",
      values: ["vol-22222222222222222"]
    }
  ]
)
pp response1.volumes # => []    


response2 = client.describe_volumes(
  filters: [
    {
      name: "volume-id",
      values: ["vol-11111111111111111"]
    }
  ]
)
pp response2.volumes # => "vol-11111111111111111" ボリュームの情報

以上です。

参考

aws.amazon.com

紅林輝(くればやしあきら)(サービス開発部) サバワクブログの記事一覧はコチラ

サービス開発部所属。2015年にサーバーワークスにJOIN。クラウドインテグレーション部を経て、現在はAWS運用自動化サービスCloud Automatorの開発に従事。主にバックエンドやサーバレスを担当。卓球熱再燃中🔥