サンプル集  >  Rust  >  RustのLambdaでDynamoDBへレコード追加
RustのLambdaでDynamoDBへレコード追加
2025/12/06

RustのLambdaでDynamoDBへレコードを追加してみます。

  1. プロジェクトの作成とデプロイ
  2. DynamoDBのテーブル作成
  3. プログラム作成
  4. Visual Studio Build Toolsをインストール(失敗)
  5. wslでbuild(失敗)
  6. 手動でzigをインストール
  7. 動作確認
◆環境
OS Windows 11 Home 25H2
rustc 1.91.1
cargo 1.91.1

プロジェクトの作成とデプロイ

プロジェクトを作成しデプロイします。

cargo lambda new ymwrust013 --http-feature=apigw_rest

コマンドプロンプトでプロジェクトを作成したいフォルダへ移動しコマンドを実行します。

> cd c:\rust-workspace

> cargo lambda new ymwrust013 --http-feature=apigw_rest

> code ymwrust013

デプロイします。

> cargo lambda deploy --enable-function-url ymwrust013

動作確認してみます。

> cargo lambda invoke --remote ymwrust013 --data-example apigw-reques
t

DynamoDBのテーブル作成

DynamoDBにテーブルを作成します。

aws dynamodb create-table ^
  --table-name chat_log ^
  --attribute-definitions AttributeName=id,AttributeType=S ^
  --key-schema AttributeName=id,KeyType=HASH ^
  --billing-mode PAY_PER_REQUEST

プログラム作成

Cargo.toml
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 

 8: 
 9: 
10: 
11: 

12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
[package]
name = "ymwrust013"
version = "0.1.0"
edition = "2021"

[dependencies]
lambda_http = { version = "1.0.0", default-features = false, fe
atures = ["apigw_rest""tracing"] }

tokio = { version = "1", features = ["macros"] }

aws-config = { version = "1.0.1", features = ["behavior-version
-latest"
] }

aws-sdk-dynamodb = { version = "1.3.0" }

serde = { version = "1.0", features = ["derive"] }
serde_json = "1"

chrono = { version = "0.4", features = ["clock"] }

tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["fmt"] }

main.rs
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
47: 
48: 
49: 
50: 
51: 
52: 
53: 
54: 
55: 
56: 
use lambda_http::{service_fn, Error, LambdaEvent
                 ,lambda_runtime};
use aws_sdk_dynamodb::{Client, types::AttributeValue};
use serde_json::{Value, json};
use tracing::{info};
use tracing_subscriber;

#[tokio::main]
async fn main() -> Result<(), Error> {
    let is_lambda = std::env::var("AWS_LAMBDA_FUNCTION_NAME")
                                 .is_ok();

    // CloudWatch Logs に出力するための tracing 初期化
    tracing_subscriber::fmt()
        .without_time()
        .with_target(false)
        .with_ansi(!is_lambda)
        .init();

    let func = service_fn(handler);
    lambda_runtime::run(func).await?;
    Ok(())
}

async fn handler(_event: LambdaEvent<Value>)
         -> Result<Value, Error> {
    info!("START handler");

    let config = aws_config::load_from_env().await;
    let client = Client::new(&config);

    let table = "chat_log";

    for i in 0..10 {
        client
        .put_item()
        .table_name(table)
        .item("id", AttributeValue::S(format!("id-{}", i)))
        .item("message"
             , AttributeValue::S(format!("message-{}", i)))
        .item("prompt_tokens"
             , AttributeValue::N(format!("{}", i)))
        .item("completion_tokens"
             , AttributeValue::N(format!("{}", i)))
        .item("review", AttributeValue::S(format!("{}", i)))
        .item("timestamp"
             , AttributeValue::N(chrono::Utc::now()
                                .timestamp_millis()
                                .to_string()))
        .send()
        .await?;
    }

    info!("END handler");
    Ok(json!({"status""OK""inserted": 10}))
}

buildしたところエラーがでました。

>cargo lambda build --release
  Downloaded signal-hook-registry v1.4.7
  Downloaded openssl-probe v0.1.6
  Downloaded 2 crates (27.6 KB) in 0.42s
error: rustc 1.86.0 is not supported by the following packages:
  aws-sdk-dynamodb@1.100.0 requires rustc 1.88.0
  aws-sdk-sso@1.90.0 requires rustc 1.88.0
  aws-sdk-ssooidc@1.92.0 requires rustc 1.88.0
  aws-sdk-sts@1.94.0 requires rustc 1.88.0
Either upgrade rustc or select compatible dependency versions with
`cargo update <name>@<current-ver> --precise <compatible-ver>`
where `<compatible-ver>` is the latest version supporting rustc 1.86.
0

Visual Studio Build Toolsをインストール(失敗)

rustup updateします。

>rustup update stable
info: syncing channel updates for 'stable-x86_64-pc-windows-msvc'
info: latest update on 2025-11-10, rust version 1.91.1 (ed61e7d7e 202
5-11-07)
:
info: checking for self-update
info: downloading self-update

バージョンを確認。

>rustc --version
rustc 1.91.1 (ed61e7d7e 2025-11-07)

再度ビルドしてみます。

>cargo lambda build --release
   Compiling proc-macro2 v1.0.103
   Compiling quote v1.0.42
   Compiling unicode-ident v1.0.22
:
   Compiling pin-project v1.1.10
   Compiling zerovec v0.11.5
   Compiling zerotrie v0.2.3
error: failed to run custom build command for `ring v0.17.14`
:
error: failed to run custom build command for `aws-lc-sys v0.34.0`
:
  error occurred in cc-rs: failed to find tool "ar": program not foun
d (see https://docs.rs/cc/latest/cc/#compile-time-requirements for 
help)

arというツールがないというエラーのようです。

調べたところ Visual Studio Build Toolsをインストールする必要があるようです。

VisualStudioSetup.exe

exeを起動します。


更新をクリックします。


更新が始まりました。


Install nowをクリックします。


次へをクリックします。


OKをクリックします。


C++によるデスクトップ開発をチェックし右のMSVC~を4つチェックしてインストールをクリックします。


続行をクリックします。


PCを再起動します。


状況は変わりませんでした。

wslでbuild(失敗)

wslで実施してみます。

sudo apt update
sudo apt install -y build-essential
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
cargo install cargo-lambda
sudo apt install -y zig

zigのインストールでエラーが出ました。

$ sudo apt install -y zig
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package zig

snapでインストールしてみます。

$ sudo snap install zig --classic
error: snap "zig" is not available on stable but is available to inst
all on the following channels:

       beta       snap install --beta zig
       edge       snap install --edge zig

       Please be mindful pre-release channels may include features no
t completely tested or
       implemented. Get more information with 'snap info zig'.

--betaを指定してインストールしてみます。。

$ sudo snap install --beta zig --classic
2025-12-07T12:28:33+09:00 INFO Waiting for automatic snapd restart...
zig (beta) 0.15.2 from Jay Petacat (jayschwa) installed

状況は変わりませんでした。

手動でzigをインストール

手動でzigをインストールします。

cd /tmp
curl -LO https://ziglang.org/download/0.12.1/zig-linux-x86_64-0.12.1.
tar.xz

ファイルを確認します。

$ ls -lh zig-linux-x86_64-0.12.1.tar.xz
-rw-r--r-- 1 ymlibadmin ymlibadmin 44M Dec  7 14:33 zig-linux-x86_64-
0.12.1.tar.xz

xzを展開しインストールします。

$ tar xf zig-linux-x86_64-0.12.1.tar.xz
$ sudo mv zig-linux-x86_64-0.12.1 /opt/zig
$ sudo ln -s /opt/zig/zig /usr/local/bin/zig
$ zig version
0.12.1

ビルドしてみます。

$ cargo lambda build --release
   Compiling ymwrust013 v0.1.0 (/mnt/c/rust-workspace/ymwrust013)
    Finished `release` profile [optimized] target(s) in 22.26s

ファイルができているか確認します。

$ ls -lh ./target/lambda/ymwrust013/bootstrap.zip
-rwxrwxrwx 1 ymlibadmin ymlibadmin 15M Dec  7 07:12 ./target/lambda/y
mwrust013/bootstrap.zip

デプロイします。

$ cargo lambda deploy --enable-function-url ymwrust013
✅ function deployed successfully 🎉
🛠️  binary last compiled 3 minutes ago
🔍 arn: arn:aws:lambda:ap-northeast-1:8...:function:ymwrust013:4
🎭 version: 4
🔗 url: https://2gb...xcl.lambda-url.ap-northeast-1.on.aws/

正常にデプロイできたようです。

動作確認

実行してみます。

$ cargo lambda invoke --remote ymwrust013 --data-example apigw-reque
st
Error: alloc::boxed::Box<dyn core::error::Error + core::marker::Send 
+ core::marker::Sync>


  × service error

  Was this behavior unexpected?
  Start a thread in https://github.com/cargo-lambda/cargo-lambda/disc
ussions

CloudWatchを確認します。 dynamodb:PutItemの権限が無いようです。

User: arn:aws:sts::8.../ymwrust013 is not authorized to perform: dyna
modb:PutItem on resource: arn:aws:dynamodb:ap-northeast-1:8...:tabl
e/chat_log because no identity-based policy allows the dynamodb:Put
Item action

AWSマネジメントコンソールでLambdaを開き設定をクリックし左に表示されているアクセス権限をクリックしロール名をクリックします。


許可を追加をクリックしインラインポリシーを作成をクリックします。


サービスにdynamodbと入力します。


アクション許可にputiと入力します。


PutItemにチェックをして次へをクリックします。


リソースが指定されていないというエラーがでました。


下にスクロールさせてリソース欄のARNを追加をクリックします。



次へをクリックします。


画面を下にスクロールさせてポリシーの作成をクリックします。


ポリシー名が必要というエラーがでました。


ポリシー名を入力しポリシーの作成をクリックします。


ポリシーが作成されました。


再度実行したところOKが返って来ました!

$ cargo lambda invoke --remote ymwrust013 --data-example apigw-reques
t
{"inserted":10,"status":"OK"}

DynamoDBにレコードが10件追加されていました!


もう一度実行したところ正常終了しましたがレコードは10件のままでした。


timestampの値が更新されているので同じIDのものをPutItemすると更新されるようです。

▲ PageTop  ■ Home


Copyright (C) 2025 ymlib.com