On this page

This guide assumes that you have followed the steps in the [Getting Started](/content/docs/get-started/index.html) guide, and have the access keys available.

You may continue to use the ExAWS SDK as you normally would, but with the endpoint set to Tigris at [https://t3.storage.dev](https://t3.storage.dev/).

This example reads the credentials from the environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`.

## ExAWS configuration

### Dependencies

Add the dependencies to your `mix.exs` file:

```elixir
  defp deps do

[\
\
      {:ex_aws, "~> 2.0"},\
\
      {:ex_aws_s3, "~> 2.0"},\
\
      {:poison, "~> 3.0"},\
\
      {:hackney, "~> 1.9"},\
\
      {:sweet_xml, "~> 0.6.6"},\
\
      {:jason, "~> 1.1"},\
\
    ]

end
```

### Development configuration

Now setup the configuration for ex_aws and ex_aws_s3 in your `dev.exs` file (or `config/config.exs` file):

```elixir
import Config

# Configure S3 client for access to Tigris

config :ex_aws,

debug_requests: true,

json_codec: Jason,

access_key_id: {:system, "AWS_ACCESS_KEY_ID"},

secret_access_key: {:system, "AWS_SECRET_ACCESS_KEY"}

config :ex_aws, :s3,

scheme: "https://",

host: "t3.storage.dev",

region: "auto"
```

In the first config we configure :ex_aws, by setting the access_key_id and secret_access_key. In this case we use AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables to store the access keys we will use to access Tigris.

Then we configure the S3 API endpoint, which is "t3.storage.dev".

### Runtime configuration

Now similar to above, let's add the configuration in `runtime.exs` file:

```elixir
import Config

if config_env() == :prod do

# ....

# Configure S3 client for access to Tigris

config :ex_aws,

debug_requests: true,

json_codec: Jason,

access_key_id: {:system, "AWS_ACCESS_KEY_ID"},

secret_access_key: {:system, "AWS_SECRET_ACCESS_KEY"}

config :ex_aws, :s3,

scheme: "https://",

host: "t3.storage.dev",

region: "auto"

end
```

## Example

```elixir
# List all buckets

all_buckets = ExAws.S3.list_buckets() |> ExAws.request!()

IO.puts("Buckets:")

for bucket <- all_buckets.body.buckets do

IO.puts(bucket.name)

end

# List all objects in bucket tigris-example

bucket_name = "tigris-example"

all_objects = ExAws.S3.list_objects(bucket_name) |> ExAws.request!() |> get_in([:body, :contents])

IO.puts("Objects:")

for object <- all_objects do

IO.puts(object.key)

end

# Put bar.txt

key = "bar.txt"

body = "Hello, world!"

response = ExAws.S3.put_object(bucket_name, key, body) |> ExAws.request!()

assert response.status_code == 200

# Read back bar.txt

response = ExAws.S3.get_object(bucket_name, key) |> ExAws.request!()

assert response.status_code == 200

assert response.body == body
```

## Using presigned URLs

Presigned URLs can be used with the ExAWS SDK as follows:

```elixir
bucket_name = "tigris-example"

key = "bar_ex.txt"

{:ok, presigned_url} =

ExAws.Config.new(:s3) |> ExAws.S3.presigned_url(:get, bucket_name, key, expires_in: 300)

IO.puts("Presigned URL for GET:")

IO.puts(presigned_url)

{:ok, presigned_url} =

ExAws.Config.new(:s3) |> ExAws.S3.presigned_url(:put, bucket_name, key, expires_in: 300)

IO.puts("Presigned URL for PUT:")

IO.puts(presigned_url)
```

### Presigned URLs with custom domains

You can also use a [presigned URL with a custom domain](/content/docs/objects/presigned/#presigned-url-with-custom-domain/index.html) by replacing the bucket host with your custom domain:

```elixir
branded_url = String.replace(

presigned_url, "foo-bucket.t3.storage.dev", "your-domain.example.com")

IO.puts("Presigned URL for GET (custom domain): #{branded_url}")
```
