Current section
Files
Jump to
Current section
Files
lib/aws_metadata/client.ex
defmodule AWSMetadata.Client do
@moduledoc """
Calls out to metadata service endpoints to collect IAM role info.
"""
@credential_url "http://169.254.169.254/latest/meta-data/iam/security-credentials/"
@document_url "http://169.254.169.254/latest/dynamic/instance-identity/document"
def fetch do
role = fetch_role()
metadata = fetch_metadata(role)
region = fetch_document()
client = %{
access_key_id: metadata[:access_key_id],
secret_access_key: metadata[:secret_access_key],
region: region,
token: metadata[:token],
endpoint: "amazonaws.com"
}
{:ok, exp_datetime, 0} = DateTime.from_iso8601(metadata[:expiration])
{:ok, client, exp_datetime}
end
defp fetch_role do
%HTTPoison.Response{status_code: 200, body: body} =
HTTPoison.get!(@credential_url)
body
end
defp fetch_metadata(role) do
%HTTPoison.Response{status_code: 200, body: body} =
HTTPoison.get!("#{@credential_url}#{role}")
result = Poison.decode!(body)
%{
access_key_id: result["AccessKeyId"],
secret_access_key: result["SecretAccessKey"],
token: result["Token"],
expiration: result["Expiration"]
}
end
defp fetch_document do
%HTTPoison.Response{status_code: 200, body: body} =
HTTPoison.get!(@document_url)
body |> Poison.decode!() |> Map.get("region")
end
end