LoginSignup
12
7

2023/11にAWS SDK for Rustの一般提供が開始されたようでした!

最近はRustしか触っておらず、CLIツールやWebAPIなどで今後S3をRustから利用することもあろうと思い、ちょっとだけ触ってみました!

まずは情報を眺めてみる

さすがAWS!という感じで、情報はそれなりに豊富にあるようでした!

今回は以下を参考にしました!

プロジェクトを立ち上げる

コードは以下のリポジトリにアップロードしているので、cloneしてください!

プロジェクトの立ち上げ方はこちらにも記載しています。

Cargo.tomlは以下のように設定しています。

[package]
name = "rust-aws"
version = "0.1.0"
edition = "2021"

[dependencies]
anyhow = "1.0.79"
aws-config = { version = "1.0.1", features = ["behavior-version-latest"] }
aws-sdk-s3 = { version = "1.4.0", features = ["rt-tokio"] }
tokio = { version = "1.20.1", features = ["full"] }

バケットを作成する

以下のtextを参考にしながら進めていきました!

こんなようなコードになりました。

use anyhow::Error;
use aws_sdk_s3::operation::create_bucket::{CreateBucketError, CreateBucketOutput};
use aws_sdk_s3::types::{BucketLocationConstraint, CreateBucketConfiguration};
use aws_sdk_s3::{error::SdkError, Client};
use std::str;

async fn create_bucket(
    client: &Client,
    bucket_name: &str,
    region: &str,
) -> Result<CreateBucketOutput, SdkError<CreateBucketError>> {
    let constraint = BucketLocationConstraint::from(region);
    let cfg = CreateBucketConfiguration::builder()
        .location_constraint(constraint)
        .build();
    client
        .create_bucket()
        .create_bucket_configuration(cfg)
        .bucket(bucket_name)
        .send()
        .await
}

#[tokio::main]
async fn main() {
    let config = aws_config::load_from_env().await;
    let client = aws_sdk_s3::Client::new(&config);
    let bucket_name = "rust-sdk-test-bucket1";
    let region = "ap-northeast-1";

    let result = create_bucket(&client, bucket_name, region).await;
    match result {
        Ok(output) => println!("Bucket location: {:?}", output.location()),
        Err(error) => println!("Error: {:?}", error),
    }
}

やっていることはとてもシンプルですね。

  • anyhow::Error: エラーハンドリングに使用
  • aws_sdk_s3など: S3とのやり取りに必要な機能

main()関数では#[tokio::main]を利用し非同期処理を可能にします。

AWSの設定は、環境変数からロードするため、実行時にはターミナルにシークレットキーなどを設定しておく必要があります。

cargo runでコマンドを実行してみましょう。

image.png

バケットが作成されました!

バケットを削除

以下のように削除用のコードを追加してみましょう!

use anyhow::Error;
use aws_sdk_s3::operation::create_bucket::{CreateBucketError, CreateBucketOutput};
use aws_sdk_s3::types::{BucketLocationConstraint, CreateBucketConfiguration};
use aws_sdk_s3::{error::SdkError, Client};
use std::str;

async fn create_bucket(
    client: &Client,
    bucket_name: &str,
    region: &str,
) -> Result<CreateBucketOutput, SdkError<CreateBucketError>> {
    let constraint = BucketLocationConstraint::from(region);
    let cfg = CreateBucketConfiguration::builder()
        .location_constraint(constraint)
        .build();
    client
        .create_bucket()
        .create_bucket_configuration(cfg)
        .bucket(bucket_name)
        .send()
        .await
}

async fn delete_bucket(client: &Client, bucket_name: &str) -> Result<(), Error> {
    client.delete_bucket().bucket(bucket_name).send().await?;
    Ok(())
}

#[tokio::main]
async fn main() {
    let config = aws_config::load_from_env().await;
    let client = aws_sdk_s3::Client::new(&config);
    let bucket_name = "rust-sdk-test-bucket1";
    let region = "ap-northeast-1";

    let result = create_bucket(&client, bucket_name, region).await;
    match result {
        Ok(output) => println!("Bucket location: {:?}", output.location()),
        Err(error) => println!("Error: {:?}", error),
    }

    let result = delete_bucket(&client, bucket_name).await;
    match result {
        Ok(_) => println!("Bucket deleted"),
        Err(error) => println!("Error: {:?}", error),
    }
}

cargo runを実行すると、create_bucket()関数実行箇所で、すでにバケットが存在するのでエラーが発生しますが、Bucket deletedのメッセージが表示されます。

実際に先ほど見ていた画面を更新すると、バケットが削除されたため「不明なエラー」が出ていることがわかります。
(もちろん、一覧からも削除されているはずです。)

image.png

簡単ですね!

終わりに

他の言語でAWS SDKを触ったことがあればわかると思いますが、(この程度の作業であれば)全く違和感なく作業することができます!

ガシガシ使っていきましょう!

12
7
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
12
7