Skip to content

Instantly share code, notes, and snippets.

@fmcgeough
Last active March 18, 2018 16:47
Show Gist options
  • Select an option

  • Save fmcgeough/b9b402a872e302f889de944420eda8d7 to your computer and use it in GitHub Desktop.

Select an option

Save fmcgeough/b9b402a872e302f889de944420eda8d7 to your computer and use it in GitHub Desktop.
Elixir paging AWS API results
defmodule CodeDeployInstances do
@moduledoc """
Given a CodeDeploy Deployment Id return the instance ids deployed to.
"""
@doc """
Given a CodeDeploy Deployment Id return the instance ids deployed to.
Returns `{:ok, [instance_id, ...]}` on success, or `{:error, []}` on failure.
The AWS API is paged. This module takes care of the paging and returns the
entire list.
"""
def list_instances(deployment_id, keys) do
{result, instances} = aws_list_instances(deployment_id, keys)
handle_paging(
result,
deployment_id,
instances["instancesList"],
instances["nextToken"],
keys
)
end
defp handle_paging(:ok, _deploy_id, acc, nil, _keys), do: {:ok, acc}
defp handle_paging(:error, _deploy_id, _acc, _next_token, _keys), do: {:error, []}
defp handle_paging(:ok, deploy_id, acc, next_token, keys) do
{result, instances} = aws_list_instances(deploy_id, keys, next_token: next_token)
handle_paging(
result,
deploy_id,
Enum.concat(acc, instances["instancesList"]),
instances["nextToken"],
keys
)
end
# Ease burden on paging by returning similar data for both
# :ok and :error cases.
defp aws_list_instances(deploy_id, keys, opts \\ []) do
ExAws.CodeDeploy.list_deployment_instances(deploy_id, opts)
|> ExAws.request(keys)
|> case do
{:ok, instances} -> {:ok, instances}
_ -> {:error, %{"instancesList" => []}}
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment