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

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

新規登録して質問してみよう
ただいま回答率
87.20%
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スクリプトは「サーバサイドスクリプト」と呼ばれています。

受付中

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

RyoS_
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評価

0クリップ

424閲覧

投稿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

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

バックエンド

app/Http/Controllers/ContactCOntroller.php

php:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; // Validation use App\Http\Requests\StoreContact; // AWS DynamoDB use Aws\Sdk; use Aws\DynamoDb\Exception\DynamoDbException; use Aws\DynamoDb\Marshaler; class ContactController extends Controller { public function store(StoreContact $request) { // value $name = $request->input("name"); $email = $request->input("email"); $contact = $request->input("contact"); echo $name; echo $email; echo $contact; // dynamoDB $sdk = new Sdk([ 'endpoint' => 'http://dynamodb.ap-northeast-1.amazonaws.com', 'region' => 'ap-northeast-1', 'version' => 'latest' ]); $dynamodb = $sdk->createDynamoDb(); $marshaler = new Marshaler(); $tableName = 'contact'; $item = $marshaler->marshalJson(' { "id": "1", "name": "' . $name . '", "email": "' . $email . '", "contact": "' . $contact . '", } '); $params = [ 'TableName' => $tableName, 'Item' => $item ]; try { $dynamodb->putItem($params); } catch (DynamoDbException $e) { echo $e->getMessage(); } } }

routes/api.php

php:

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

デプロイ

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

yml:

service: laravel provider: name: aws region: ap-northeast-1 stage: dev runtime: provided.al2 lambdaHashingVersion: 20201221 iam.role.statements: # DynamoDBの権限をLambdaに付与する - Effect: Allow Action: - dynamodb:Query - dynamodb:Scan - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem Resource: 'arn:aws:dynamodb:*:*:table/*' package: patterns: - node_modules/** - public/storage - resources/assets/** - storage/** - tests/** functions: web: handler: public/index.php timeout: 28 layers: - ${bref:layer.php-74-fpm} # API Gateway events: - httpApi: '*' artisan: handler: artisan timeout: 120 layers: - ${bref:layer.php-74} - ${bref:layer.console} resources: Resources: # DynamoDB contact: Type: AWS::DynamoDB::Table Properties: # テーブル名 TableName: contact # キーの型を指定 AttributeDefinitions: - AttributeName: id AttributeType: S # キーの種類を指定(ハッシュもしくはレンジ) KeySchema: - AttributeName: id KeyType: HASH # プロビジョニングするキャパシティーユニットの設定 ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 plugins: - ./vendor/bref/bref

試したこと

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

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

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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スクリプトは「サーバサイドスクリプト」と呼ばれています。