1
Help us understand the problem. What are the problem?

posted at

updated at

【Rust】AWS LambdaでDynamoDB検索

AWS LambdaをRustで実装する際のサンプルコードが少なすぎるのでメモ

内容

DynamoDBの検索(スキャン)
例として、とある学校の生徒管理テーブルから指定した部活に所属する生徒の氏名一覧で取得することを考える。

  • テーブル名:students_table
    • 項目1:name(氏名)
    • 項目2:club(部活)

コード

Cargo.toml
[package]
name = "sample"
version = "0.1.0"
edition = "2021"

[dependencies]
aws-config = "0.9.0"
aws-types = "0.9.0"
aws-sdk-dynamodb = "0.9.0"
lambda_runtime = "0.5.1"
serde_json = "1.0.79"
tokio = "1.17.0"
main.rs
use aws_config::meta::region::RegionProviderChain;
use aws_sdk_dynamodb::model::AttributeValue;
use aws_sdk_dynamodb::Client as DdbClient;
use aws_types::region::Region;
use lambda_runtime::{service_fn, Error, LambdaEvent};
use serde_json::{json, Value};
use std::process::exit;

#[tokio::main]
async fn main() -> Result<(), Error> {
    let func = service_fn(func);
    lambda_runtime::run(func).await?;
    Ok(())
}

async fn func(_event: LambdaEvent<Value>) -> Result<Value, Error> {
    // DynamoDBクライアント用意
    let region_provider = RegionProviderChain::first_try(Region::new("ap-northeast-1"));
    let shared_config = aws_config::from_env().region(region_provider).load().await;
    let client = DdbClient::new(&shared_config);

    // 検索
    let club = "baseball"; // 検索対象(野球部)
    let names = match client
        .scan()
        .table_name("students_table")
        .filter_expression(format!("club = :val"))
        .expression_attribute_values(":val", AttributeValue::S(club.into()))
        .send()
        .await
    {
        Ok(output) => {
            println!("Found {} items from DynamoDB", output.count());
            let mut names: Vec<String> = Vec::new();
            // 検索結果一覧取得
            let items = output.items().unwrap();
            // name取り出し
            for item in items {
                names.push(item["name"].as_s().unwrap().clone());
            }
            names
        }
        Err(e) => {
            println!("Got an error while scanning DB: {}", e);
            exit(1);
        }
    };

    // 検索結果を表示
    for name in names {
        println!("{}", name)
    }

    Ok(json!({ "message": "success" }))
}

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?