前提・実現したいこと
以下の構成でお問い合わせフォームを作成しています。
フロントエンド > 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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー