I want to try use DynamoDb by php. I have installed DynamoDb im my local. I have read this document http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html#Tools.DynamoDBLocal.UsageNotes
DynamoDb works very well in my local. But I can not connect to it using php code..
Forexample:
<?php
namespace App\Http\Controllers;
use Laravel\Lumen\Routing\Controller as BaseController;
use Aws\Sdk;
class Dynamodb extends BaseController
{
public function connection()
{
$sdk = new Sdk([
'region' => 'us-west-2',
'version' => 'latest',
'endpoint' => 'http://localhost:8000'
]);
$dynamodb = $sdk->createDynamoDb();
$tableName = 'users';
$result = $dynamodb->createTable([
'TableName' => $tableName,
'AttributeDefinitions' => [
[ 'AttributeName' => 'Id', 'AttributeType' => 'N' ]
],
'KeySchema' => [
[ 'AttributeName' => 'Id', 'KeyType' => 'HASH' ]
],
'ProvisionedThroughput' => [
'ReadCapacityUnits' => 5,
'WriteCapacityUnits' => 6
]
]);
print_r($result->getPath('TableDescription'));
}
}
Firstly I was make sure DynamoDb works in local using telnet. The server can return a response..
Like this..
$ telnet 127.0.0.1 8000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
/help
HTTP/1.1 400 Bad Request
Content-Length: 0
Connection: close
Server: Jetty(8.1.12.v20130726)
Connection closed by foreign host.
When this code is run, I call 'connection' method via http router(Lumen FrameWork). It returns this error messages;
[2015-12-06 14:36:50] lumen.ERROR: exception 'Aws\Exception\CredentialsException' with message 'Error retrieving credentials from the instance profile metadata server. (cURL error 28: Connection timed out after 1006 milliseconds (see http://curl.haxx.se/libcurl/c/libcurl-errors.html))' in /home/mo/works/projects/dynamodb-test/vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php:79
Stack trace:
#0 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(199): Aws\Credentials\InstanceProfileProvider->Aws\Credentials\{closure}(Array)
#1 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(152): GuzzleHttp\Promise\Promise::callHandler(2, Array, Array)
#2 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/TaskQueue.php(60): GuzzleHttp\Promise\Promise::GuzzleHttp\Promise\{closure}()
#3 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(96): GuzzleHttp\Promise\TaskQueue->run()
#4 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(123): GuzzleHttp\Handler\CurlMultiHandler->tick()
#5 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(240): GuzzleHttp\Handler\CurlMultiHandler->execute(true)
#6 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(217): GuzzleHttp\Promise\Promise->invokeWaitFn()
#7 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(261): GuzzleHttp\Promise\Promise->waitIfPending()
#8 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(219): GuzzleHttp\Promise\Promise->invokeWaitList()
#9 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(261): GuzzleHttp\Promise\Promise->waitIfPending()
#10 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(219): GuzzleHttp\Promise\Promise->invokeWaitList()
#11 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(62): GuzzleHttp\Promise\Promise->waitIfPending()
#12 /home/mo/works/projects/dynamodb-test/vendor/aws/aws-sdk-php/src/AwsClient.php(202): GuzzleHttp\Promise\Promise->wait()
#13 /home/mo/works/projects/dynamodb-test/vendor/aws/aws-sdk-php/src/AwsClient.php(167): Aws\AwsClient->execute(Object(Aws\Command))
#14 /home/mo/works/projects/dynamodb-test/app/Http/Controllers/Dynamodb.php(35): Aws\AwsClient->__call('createTable', Array)
#15 /home/mo/works/projects/dynamodb-test/app/Http/Controllers/Dynamodb.php(35): Aws\DynamoDb\DynamoDbClient->createTable(Array)
#16 [internal function]: App\Http\Controllers\Dynamodb->connection()
#17 /home/mo/works/projects/dynamodb-test/vendor/illuminate/container/Container.php(503): call_user_func_array(Array, Array)
#18 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1399): Illuminate\Container\Container->call(Array, Array)
#19 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1364): Laravel\Lumen\Application->callControllerCallable(Array, Array)
#20 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1335): Laravel\Lumen\Application->callLumenController(Object(App\Http\Controllers\Dynamodb), 'connection', Array)
#21 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1303): Laravel\Lumen\Application->callControllerAction(Array)
#22 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1288): Laravel\Lumen\Application->callActionOnArrayBasedRoute(Array)
#23 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1207): Laravel\Lumen\Application->handleFoundRoute(Array)
#24 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1442): Laravel\Lumen\Application->Laravel\Lumen\{closure}()
#25 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1213): Laravel\Lumen\Application->sendThroughPipeline(Array, Object(Closure))
#26 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1153): Laravel\Lumen\Application->dispatch(NULL)
#27 /home/mo/works/projects/dynamodb-test/public/index.php(28): Laravel\Lumen\Application->run()
#28 /home/mo/works/projects/dynamodb-test/server.php(12): require_once('/home/mo/works/...')
#29 {main}
I should to have the credentials to using DynamoDb in use local? There is nothing about this point in AWS document..
Hi @muratsplat,
The error you're seeing is being returned by your local instance of DynamoDB but by the SDK. By default, the SDK tries to source credentials from the environment to sign request. You can disable this behavior by passing 'credentials' => false to the client constructor.
Please feel free to reopen if you have any further questions or concerns.
Hi @jeskew
I was added credentials parameter as "false" you said. Now it returns different error.
Next exception 'Aws\DynamoDb\Exception\DynamoDbException' with message 'Error executing "CreateTable" on "http://localhost:8000"; AWS HTTP error: Client error: `POST http://localhost:8000` resulted in a `400 Bad Request` response:
{"__type":"com.amazonaws.dynamodb.v20120810#MissingAuthenticationToken","message":"Request must contain either a valid ( (truncated...)
MissingAuthenticationToken (client): Request must contain either a valid (registered) AWS access key ID or X.509 certificate. - {"__type":"com.amazonaws.dynamodb.v20120810#MissingAuthenticationToken","message":"Request must contain either a valid (registered) AWS access key ID or X.509 certificate."}' in /home/mo/works/projects/dynamodb-test/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php:159
Stack trace:
#0 /home/mo/works/projects/dynamodb-test/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php(77): Aws\WrappedHttpHandler->parseError(Array, Object(GuzzleHttp\Psr7\Request), Object(Aws\Command))
#1 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(199): Aws\WrappedHttpHandler->Aws\{closure}(Array)
#2 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(170): GuzzleHttp\Promise\Promise::callHandler(2, Array, Array)
#3 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/RejectedPromise.php(40): GuzzleHttp\Promise\Promise::GuzzleHttp\Promise\{closure}(Array)
#4 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/TaskQueue.php(60): GuzzleHttp\Promise\RejectedPromise::GuzzleHttp\Promise\{closure}()
#5 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(96): GuzzleHttp\Promise\TaskQueue->run()
#6 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(123): GuzzleHttp\Handler\CurlMultiHandler->tick()
#7 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(240): GuzzleHttp\Handler\CurlMultiHandler->execute(true)
#8 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(217): GuzzleHttp\Promise\Promise->invokeWaitFn()
#9 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(261): GuzzleHttp\Promise\Promise->waitIfPending()
#10 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(219): GuzzleHttp\Promise\Promise->invokeWaitList()
#11 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(261): GuzzleHttp\Promise\Promise->waitIfPending()
#12 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(219): GuzzleHttp\Promise\Promise->invokeWaitList()
#13 /home/mo/works/projects/dynamodb-test/vendor/guzzlehttp/promises/src/Promise.php(62): GuzzleHttp\Promise\Promise->waitIfPending()
#14 /home/mo/works/projects/dynamodb-test/vendor/aws/aws-sdk-php/src/AwsClient.php(202): GuzzleHttp\Promise\Promise->wait()
#15 /home/mo/works/projects/dynamodb-test/vendor/aws/aws-sdk-php/src/AwsClient.php(167): Aws\AwsClient->execute(Object(Aws\Command))
#16 /home/mo/works/projects/dynamodb-test/app/Http/Controllers/Dynamodb.php(37): Aws\AwsClient->__call('createTable', Array)
#17 /home/mo/works/projects/dynamodb-test/app/Http/Controllers/Dynamodb.php(37): Aws\DynamoDb\DynamoDbClient->createTable(Array)
#18 [internal function]: App\Http\Controllers\Dynamodb->connection()
#19 /home/mo/works/projects/dynamodb-test/vendor/illuminate/container/Container.php(503): call_user_func_array(Array, Array)
#20 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1399): Illuminate\Container\Container->call(Array, Array)
#21 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1364): Laravel\Lumen\Application->callControllerCallable(Array, Array)
#22 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1335): Laravel\Lumen\Application->callLumenController(Object(App\Http\Controllers\Dynamodb), 'connection', Array)
#23 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1303): Laravel\Lumen\Application->callControllerAction(Array)
#24 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1288): Laravel\Lumen\Application->callActionOnArrayBasedRoute(Array)
#25 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1207): Laravel\Lumen\Application->handleFoundRoute(Array)
#26 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1442): Laravel\Lumen\Application->Laravel\Lumen\{closure}()
#27 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1213): Laravel\Lumen\Application->sendThroughPipeline(Array, Object(Closure))
#28 /home/mo/works/projects/dynamodb-test/vendor/laravel/lumen-framework/src/Application.php(1153): Laravel\Lumen\Application->dispatch(NULL)
#29 /home/mo/works/projects/dynamodb-test/public/index.php(28): Laravel\Lumen\Application->run()
#30 /home/mo/works/projects/dynamodb-test/server.php(12): require_once('/home/mo/works/...')
#31 {main}
It looks like DynamoDB local _does_ require credentials, but it has no credential store to check them against. Testing locally, I found that any key/secret pair would work. Try creating a Dynamo client with hard-coded credentials that wouldn't work in production:
$dynamodb = new \Aws\DynamoDb\DynamoDbClient([
'region' => 'us-west-2',
'version' => 'latest',
'endpoint' => 'http://localhost:8000',
'credentials' => [
'key' => 'not-a-real-key',
'secret' => 'not-a-real-secret',
],
]);
Unless you start DynamoDB Local with the --sharedDb flag, the credentials are used to keep separate databases for separate users.
Hope that helps!
@jeskew Thanks :+1:
Your suggestion solved my problem. It looks php client connects DynamoDb in local..
Most helpful comment
It looks like DynamoDB local _does_ require credentials, but it has no credential store to check them against. Testing locally, I found that any key/secret pair would work. Try creating a Dynamo client with hard-coded credentials that wouldn't work in production:
Unless you start DynamoDB Local with the
--sharedDbflag, the credentials are used to keep separate databases for separate users.Hope that helps!