2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rust用AWS SDKのRusotoでdefault以外の名前付きプロファイルを使用する

Posted at

はじめに

RusotoはRustのためのAWK SDKです。
↓はDynamoDBの全てのテーブルを表示するサンプルコードです。

use rusoto_core::Region;
use rusoto_dynamodb::{DynamoDb, DynamoDbClient, ListTablesInput};

#[tokio::main]
async fn main() {
    let client = DynamoDbClient::new(Region::UsEast1);
    let list_tables_input: ListTablesInput = Default::default();

    match client.list_tables(list_tables_input).await {
        Ok(output) => match output.table_names {
            Some(table_name_list) => {
                println!("Tables in database:");

                for table_name in table_name_list {
                    println!("{}", table_name);
                }
            }
            None => println!("No tables in database!"),
        },
        Err(error) => {
            println!("Error: {:?}", error);
        }
    }
}

出典: rusoto/rusoto: AWS SDK for Rust

サポートしているAWSサービスの一覧はこちらでみれます。
一部のサービスにはサンプルコードが用意されていないので、その場合はCrateのドキュメントを読みましょう。

default以外の名前付きプロファイルを使用する

上のサンプルコードではDynamoDBのクライアントを作成するのにnewを使いました。

pub fn new(region: Region) -> DynamoDbClient

名前付きプロファイルを使ってクライアントを作成するときはnew_withを使います。

pub fn new_with<P, D>(
    request_dispatcher: D,
    credentials_provider: P,
    region: region::Region,
) -> DynamoDbClient
where
    P: ProvideAwsCredentials + Send + Sync + 'static,
    D: DispatchSignedRequest + Send + Sync + 'static,

例えば、~/.aws/credentialsstagingという名前のプロファイルを使うときは、
上のサンプルコードはこのように書けます。

use rusoto_core::{HttpClient, Region};
use rusoto_core::credential::ProfileProvider;
use rusoto_dynamodb::{DynamoDb, DynamoDbClient, ListTablesInput};

#[tokio::main]
async fn main() {
    let mut provider = ProfileProvider::new().unwrap();
    provider.set_profile("staging");

    let client = DynamoDbClient::new_with(
        HttpClient::new().unwrap(),
        provider,
        Region::ApNortheast1
    );
    let list_tables_input: ListTablesInput = Default::default();

    match client.list_tables(list_tables_input).await {
        Ok(output) => match output.table_names {
            Some(table_name_list) => {
                println!("Tables in database:");

                for table_name in table_name_list {
                    println!("{}", table_name);
                }
            }
            None => println!("No tables in databases!"),
        },
        Err(error) => {
            println!("Error: {:?}", error);
        }
    }
}

AWS CLIみたいに--profileオプションでプロファイルを切り替える

コマンドライン引数を扱いたいときはclap1が便利です。
お洒落なヘルプドキュメントも自動生成してくれます。

sample.rs
use clap::{App, Arg};
use rusoto_core::{HttpClient, Region};
use rusoto_core::credential::ProfileProvider;
use rusoto_dynamodb::{DynamoDb, DynamoDbClient, ListTablesInput};

#[tokio::main]
async fn main() {
    let matches = App::new("DynamoDB ListTables")
        .version("1.0")
        .about("Sample CLI Tool")
        .arg(
            Arg::with_name("profile")
                .short("p")
                .long("profile")
                .value_name("PROFILE")
                .help("Use a specific profile from your credential file.")
                .takes_value(true),
        )
        .get_matches();

    let client = match matches.value_of("profile") {
        Some(p) => {
            let mut provider = ProfileProvider::new().unwrap();
            provider.set_profile(p);
            DynamoDbClient::new_with(
                HttpClient::new().unwrap(),
                provider,
                Region::ApNortheast1
            )
        },
        None => DynamoDbClient::new(Region::ApNortheast1)
    };

    let list_tables_input: ListTablesInput = Default::default();
    match client.list_tables(list_tables_input).await {
        Ok(output) => match output.table_names {
            Some(table_name_list) => {
                println!("Tables in database:");

                for table_name in table_name_list {
                    println!("{}", table_name);
                }
            }
            None => println!("No tables in databases!"),
        },
        Err(error) => {
            println!("Error: {:?}", error);
        }
    }
}

コンパイルして実行してみます。
実行ファイル名はsampleとしました。

$ ./sample
Tables in database:
default_table_a
default_table_b
$ ./sample --profile staging
Tables in database:
staging_table_a
staging_table_b

-hを渡してあげれば、ヘルプドキュメントが表示されます。

$ ./sample -h              
DynamoDB ListTables 1.0
Sample CLI Tool

USAGE:
    sample [OPTIONS]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -p, --profile <PROFILE>    Use a specific profile from your credential file.

参考資料

rusoto/rusoto: AWS SDK for Rust
rusoto_dynamodb::DynamoDbClient - Rust
clap-rs/clap: A full featured, fast Command Line Argument Parser for Rust

  1. clapのバージョンに気をつけてください。sample.rs2.33.1でビルドしました。この記事を執筆している時点で3.0のベータ版がプレリリースされています。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?