Skip to content

Commit

Permalink
With a profile set up, we can take advantage of the AWS Rust SDK to u…
Browse files Browse the repository at this point in the history
…se those profiles in our application.

First add the `aws_config` crate to the local `upload-pokemon-data` package. We’ll also need `tokio`, so we’ll add that now too.

```bash
cargo add -p upload-pokemon-data aws_config tokio
```

Make sure to enable the `full` feature for `tokio` in the `upload-pokemon-data` `Cargo.toml`. This enables a large set of the tokio optional features, including the macros which we’ll use soon.

```json
[dependencies]
aws-config = "0.9.0"
tokio = { version = "1.17.0", features = ["full"] }
```

The `aws-config` crate includes a `from_env` function that we can use to load credentials from the environment. This works for our local development environment on our computer as well as places like lambda functions.

```rust
async fn main() -> eyre::Result<()> {
    color_eyre::install()?;

    let config = aws_config::from_env().load().await;

    dbg!(config.region());

    ...
    Ok(())
}
```

The `.load()` function is async, so we have to `await` it, but we also have to make our `main` function async to be able to `await` it, as we can’t use `await` unless we’re inside of an async function.

Tokio helps us our here with the `tokio::main` macro, which rewrites our async main function into a regular main function that bootstraps the tokio async runtime.

The `SdkConfig` type, which is what `config` is, is a fairly large struct. The fields are mostly private and not meant to be accessed directly, so we can use `dbg!(config.region());` to see if our profile is being used.

It is likely that if you `cargo run` your application now, you will get a region of `None`, which means that we didn’t set one.

```rust
Finished dev [unoptimized + debuginfo] target(s) in 1.24s
     Running `target/debug/upload-pokemon-data`
[crates/upload-pokemon-data/src/main.rs:10] config.region() = None
```

To use our profile, we can use the environment variable `AWS_PROFILE` to select the profile we want to use.

```bash
AWS_PROFILE=rust-adventure-playground cargo run
```

My profile name is `rust-adventure-playground` so that’s what I used here. The region should now log out as the region set in your profile’s config. In my case this is `us-east-1`.

AWS has many datacenters in many locations, and the region is which datacenter we intend to deploy our data/function/etc to.

```
[crates/upload-pokemon-data/src/main.rs:10] config.region() = Some(
    Region(
        "us-east-1",
    ),
)
```
  • Loading branch information
ChristopherBiscardi committed Apr 1, 2022
1 parent 2ff3260 commit 3f2928c
Show file tree
Hide file tree
Showing 3 changed files with 1,297 additions and 86 deletions.

0 comments on commit 3f2928c

Please sign in to comment.