Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Using Version 3 of the AWS SDK for PHP

Using Version 3 of the AWS SDK for PHP

Amazon Web Services (AWS) offers a broad set of global compute, storage, database, analytics, application, and deployment services that can help PHP developers build scalable applications in the cloud. These services provide APIs that allow you to control all of your resources programmatically, even through your PHP code. Let's talk about how to use Version 3 of the open source AWS SDK for PHP (built on the Guzzle library and PSR-7) to control your AWS resources and use the AWS services from within your applications.

Jeremy Lindblom

September 10, 2015
Tweet

More Decks by Jeremy Lindblom

Other Decks in Programming

Transcript

  1. $ec2 = 'region' => 'us-east-1' 'version' => '2014-06-15' $ec2->runInstances 'ImageId'

    => 'ami-6a6dcc02' 'MinCount' => 'MaxCount' => 'InstanceType' => 'm1.small'
  2. $ec2 = ::factory 'region' => 'us-east-1' $ec2->runInstances 'ImageId' => 'ami-6a6dcc02'

    'MinCount' => 'MaxCount' => 'InstanceType' => 'm1.small'
  3. $ec2 = ::factory 'region' => 'us-east-1' $ec2->runInstances 'ImageId' => 'ami-6a6dcc02'

    'MinCount' => 'MaxCount' => 'InstanceType' => 'm1.small' 'version' => '2014-06-15'
  4. $ec2 = ::factory 'region' => 'us-east-1' $ec2->runInstances 'ImageId' => 'ami-6a6dcc02'

    'MinCount' => 'MaxCount' => 'InstanceType' => 'm1.small'
  5. $ec2 = ::factory 'region' => 'us-east-1' $ec2->runInstances 'ImageId' => 'ami-6a6dcc02'

    'MinCount' => 'MaxCount' => 'InstanceType' => 'm1.small' 'version' => '2014-06-15'
  6. $ec2 = ::factory 'region' => 'us-east-1' $ec2->runInstances 'ImageId' => 'ami-6a6dcc02'

    'MinCount' => 'MaxCount' => 'InstanceType' => 'm1.small' 'version' => '2014-06-15'
  7. •  Async requests with a Promise API •  Support for

    custom HTTP adapters –  cURL no longer required (still the default) –  Possible to implement with non-blocking event loops •  Result "Paginators" for iterating paginated data •  JMESPath querying of result data •  "debug" client option for easy debugging
  8. •  Instance profile credentials •  Credentials file •  Environment variables

    •  Client configuration FYI: Also supported by the AWS CLI and other SDKs.
  9. •  Instance profile credentials •  Credentials file •  Environment variables

    •  Client Configuration (BEWARE) 'credentials' => 'key' => $yourAccessKeyId 'secret' => $yourSecretAccessKey
  10. $s3->createBucket 'Bucket' => $bucket $s3->waitUntil 'BucketExists' 'Bucket' => $bucket $dynamoDb->createTable(['TableName'

    => $table ... $dynamoDb->waitUntil 'TableExists' 'TableName' => $table echo "Done.\n"
  11. $s3->createBucket 'Bucket' => $bucket $s3->waitUntil 'BucketExists' 'Bucket' => $bucket $dynamoDb->createTable(['TableName'

    => $table ... $dynamoDb->waitUntil 'TableExists' 'TableName' => $table echo "Done.\n"
  12. $s3->createBucket 'Bucket' => $bucket $s3->waitUntil 'BucketExists' 'Bucket' => $bucket $dynamoDb->createTable(['TableName'

    => $table ... $dynamoDb->waitUntil 'TableExists' 'TableName' => $table echo "Done.\n"
  13. $app = new $app 'aws' = function return new 'region'

    => 'us-east-1' 'version' => 'latest' // ROUTES AND OTHER APPLICATION LOGIC $app->run
  14. $app = new $app 'aws' = function return new 'region'

    => 'us-east-1' 'version' => 'latest' // ROUTES AND OTHER APPLICATION LOGIC $app->run
  15. $app = new $app 'aws' = function return new 'region'

    => 'us-east-1' 'S3' => 'version' => '2006-03-01' 'DynamoDb' => 'version' => '2012-08-10'
  16. $dynamoDb = $app 'aws' ->createDynamoDb $result = $dynamoDb->query 'TableName' =>

    'selphpies' 'Limit' => // ... $items = $result 'Items'
  17. # With Paginators $results = $s3->getPaginator 'ListObjects' 'Bucket' => 'my-bucket'

    $keys = $results->search 'Contents[].Key' foreach $keys as $key echo $key . "\n" # Without Paginators $marker = do $args = 'Bucket' => 'my-bucket' if $marker $args 'Marker' = $marker $result = $s3->listObjects $args $objects = array $result 'Contents' foreach $objects as $object echo $object 'Key' . "\n" $marker $result->search 'NextMarker || Contents[-1].Key' while $result 'IsTruncated'
  18. try { $caption = $request->request->get('selphpieCaption', '...'); $file = $request->files->get('selphpieImage'); if

    (!$file instanceof UploadedFile || $file->getError()) { throw new \RuntimeException('...'); } #1. UPLOAD THE IMAGE TO S3 #2. SAVE THE IMAGE DATA TO DYNAMODB $app['session']->getFlashBag()->add('alerts', 'success'); return $app->redirect('/'); } catch (\Exception $e) { $app['session']->getFlashBag()->add('alerts', 'danger'); return $app->redirect('/upload'); }
  19. $s3 = $app['aws']->createS3(); $result = $s3->putObject([ 'Bucket' => 'selphpies', 'Key'

    => $file->getClientOriginalName(), 'Body' => fopen($file->getFileName(), 'r'), 'ACL' => 'public-read', ]);
  20. // Automatically switches to multipart uploads // if the file

    is larger than default threshold. $result = $s3->upload( 'selphpies', $file->getClientOriginalName(), fopen($file->getPathname(), 'r'), 'public-read' );
  21. $dynamoDb->putItem([ 'TableName' => 'selphpies', 'Item' => [ // ... 'src'

    => ['S' => $result['ObjectURL']], 'caption' => ['S' => $caption], ], ]);
  22. $m = new (); $dynamoDb->putItem([ 'TableName' => 'selphpies', 'Item' =>

    $m->marshalItem([ // ... 'src' => $result['ObjectURL’], 'caption' => $caption, ]), ]);