質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

0回答

1619閲覧

【DynamoDB/PHP】「The JSON document must be valid and be an object at its root」というエラーが発生しました

RyoS_

総合スコア4

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/08/12 03:47

前提・実現したいこと

以下の構成でお問い合わせフォームを作成しています。
フロントエンド > Nuxt.js
バックエンド > Laravel
デプロイ(フロントエンド) > Netlify
デプロイ(バックエンド) > AWS Lambda, API Gateway, DynamoDB

フロントエンド側でAPIを叩き、その情報をDynamoDBにputItemしようとするとエラーが発生します。

発生している問題・エラーメッセージ

「JSONドキュメントは有効であり、ルートがオブジェクトである必要があります」ということなのですが、どのように対処すべきかが理解できませんでした。

The JSON document must be valid and be an object at its root. {"exception":"[object] (InvalidArgumentException(code: 0): The JSON document must be valid and be an object at its root. at /var/task/vendor/aws/aws-sdk-php/src/DynamoDb/Marshaler.php:99)

該当のソースコード

フロントエンド

pages/index.vue

vue:index.vue

1await this.$axios.$post('/contacts', { 2 name: `${this.firstName} ${this.lastName}`, 3 email: this.email, 4 contact: this.contact, 5});

バックエンド

app/Http/Controllers/ContactCOntroller.php

php:

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6 7// Validation 8use App\Http\Requests\StoreContact; 9 10// AWS DynamoDB 11use Aws\Sdk; 12use Aws\DynamoDb\Exception\DynamoDbException; 13use Aws\DynamoDb\Marshaler; 14 15class ContactController extends Controller 16{ 17 public function store(StoreContact $request) 18 { 19 // value 20 $name = $request->input("name"); 21 $email = $request->input("email"); 22 $contact = $request->input("contact"); 23 echo $name; 24 echo $email; 25 echo $contact; 26 27 // dynamoDB 28 $sdk = new Sdk([ 29 'endpoint' => 'http://dynamodb.ap-northeast-1.amazonaws.com', 30 'region' => 'ap-northeast-1', 31 'version' => 'latest' 32 ]); 33 34 $dynamodb = $sdk->createDynamoDb(); 35 $marshaler = new Marshaler(); 36 37 $tableName = 'contact'; 38 39 $item = $marshaler->marshalJson(' 40 { 41 "id": "1", 42 "name": "' . $name . '", 43 "email": "' . $email . '", 44 "contact": "' . $contact . '", 45 } 46 '); 47 48 $params = [ 49 'TableName' => $tableName, 50 'Item' => $item 51 ]; 52 53 try { 54 $dynamodb->putItem($params); 55 } catch (DynamoDbException $e) { 56 echo $e->getMessage(); 57 } 58 } 59}

routes/api.php

php:

1<?php 2 3use Illuminate\Http\Request; 4 5Route::post("/contacts", "ContactController@store");

デプロイ

サーバーレスフレームワークを使用しています。

yml:

1service: laravel 2 3provider: 4 name: aws 5 region: ap-northeast-1 6 stage: dev 7 runtime: provided.al2 8 lambdaHashingVersion: 20201221 9 iam.role.statements: 10 # DynamoDBの権限をLambdaに付与する 11 - Effect: Allow 12 Action: 13 - dynamodb:Query 14 - dynamodb:Scan 15 - dynamodb:GetItem 16 - dynamodb:PutItem 17 - dynamodb:UpdateItem 18 - dynamodb:DeleteItem 19 Resource: 'arn:aws:dynamodb:*:*:table/*' 20 21package: 22 patterns: 23 - node_modules/** 24 - public/storage 25 - resources/assets/** 26 - storage/** 27 - tests/** 28 29functions: 30 web: 31 handler: public/index.php 32 timeout: 28 33 layers: 34 - ${bref:layer.php-74-fpm} 35 # API Gateway 36 events: 37 - httpApi: '*' 38 39 artisan: 40 handler: artisan 41 timeout: 120 42 layers: 43 - ${bref:layer.php-74} 44 - ${bref:layer.console} 45 46resources: 47 Resources: 48 # DynamoDB 49 contact: 50 Type: AWS::DynamoDB::Table 51 Properties: 52 # テーブル名 53 TableName: contact 54 # キーの型を指定 55 AttributeDefinitions: 56 - AttributeName: id 57 AttributeType: S 58 # キーの種類を指定(ハッシュもしくはレンジ) 59 KeySchema: 60 - AttributeName: id 61 KeyType: HASH 62 # プロビジョニングするキャパシティーユニットの設定 63 ProvisionedThroughput: 64 ReadCapacityUnits: 1 65 WriteCapacityUnits: 1 66 67plugins: 68 - ./vendor/bref/bref

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問