Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Controlling the Cloud with the AWS SDK for PHP

Controlling the Cloud with 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) to control your AWS resources and use the AWS services from within your applications. (Given at ZendCon 2015)

Jeremy Lindblom

October 22, 2015
Tweet

More Decks by Jeremy Lindblom

Other Decks in Programming

Transcript

  1. AWS services each have an API, so you can control

    your resources through programs and scripts.
  2. So let's provision a web server from PHP by using

    the AWS SDK for PHP to talk to the Amazon EC2 API Amazon  EC2  
  3. $ec2 = 'region' => 'us-east-1' 'version' => '2015-10-01' $ec2->runInstances 'ImageId'

    => 'ami-6a6dcc02' 'MinCount' => 'MaxCount' => 'InstanceType' => 't2.micro'
  4. Amazon S3 Amazon SES Amazon SimpleDB Amazon SNS Amazon SQS

    Amazon SWF Amazon VPC Auto Scaling AWS CloudHSM AWS Data Pipeline AWS Elastic Beanstalk AWS Import/Export AWS OpsWorks AWS Marketplace AWS Storage Gateway AWS Support Elastic Load Balancing Amazon CloudFormation Amazon CloudFront Amazon CloudSearch Amazon CloudWatch Amazon Direct Connect Amazon DynamoDB Amazon EBS Amazon EC2 Amazon ElastiCache Amazon Elastic Transcoder Amazon EMR Amazon Glacier Amazon IAM Amazon Mechanical Turk Amazon RDS Amazon Redshift Amazon Route53
  5. $ec2 = ::factory 'region' => 'us-east-1' $ec2->runInstances 'ImageId' => 'ami-6a6dcc02'

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

    'MinCount' => 'MaxCount' => 'InstanceType' => 't2.micro' 'version' => '2015-10-01’
  7. $ec2 = ::factory 'region' => 'us-east-1' $ec2->runInstances 'ImageId' => 'ami-6a6dcc02'

    'MinCount' => 'MaxCount' => 'InstanceType' => 't2.micro'
  8. $ec2 = ::factory 'region' => 'us-east-1' $ec2->runInstances 'ImageId' => 'ami-6a6dcc02'

    'MinCount' => 'MaxCount' => 'InstanceType' => 't2.micro' 'version' => '2015-10-01'
  9. $ec2 = ::factory 'region' => 'us-east-1' $ec2->runInstances 'ImageId' => 'ami-6a6dcc02'

    'MinCount' => 'MaxCount' => 'InstanceType' => 't2.micro' 'version' => '2015-10-01'
  10. •  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
  11. •  Instance profile credentials •  Credentials file •  Environment variables

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

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

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

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

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

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

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

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

    'selphpies' 'Limit' => // ... $items = $result 'Items'
  20. # 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'
  21. 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'); }
  22. $s3 = $app['aws']->createS3(); $result = $s3->putObject([ 'Bucket' => 'selphpies', 'Key'

    => $file->getClientOriginalName(), 'Body' => fopen($file->getFileName(), 'r'), 'ACL' => 'public-read', ]);
  23. // 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' );
  24. $dynamoDb->putItem([ 'TableName' => 'selphpies', 'Item' => [ // ... 'src'

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

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