$30 off During Our Annual Pro Sale. View Details »

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. By Jeremy Lindblom (@jeremeamia)

    View Slide

  2. Jeremy Lindblom (@jeremeamia)

    View Slide

  3. View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. View Slide

  8. View Slide

  9. View Slide

  10. View Slide

  11. The Clooouuud

    View Slide

  12. View Slide

  13. "Cloud Computing"
    on-demand IT
    resources

    View Slide

  14. AWS services each have an API,
    so you can control your resources
    through programs and scripts.

    View Slide

  15. 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  

    View Slide

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

    View Slide

  17. View Slide

  18. View Slide

  19. View Slide

  20. 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

    View Slide

  21. View Slide

  22. View Slide

  23. View Slide

  24. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  30. •  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

    View Slide

  31. View Slide

  32. PHP PHP
    #nofilter
    #selphpie
    #instagood

    View Slide

  33. PHP PHP

    View Slide

  34. (Storage of selPHPies)
    (Storage of URLs/captions)
    PHP
    PHP

    View Slide

  35. View Slide

  36. "require": {
    "aws/aws-sdk-php": "~3.0",
    "silex/silex": "~1.2",
    "twig/twig": "~1.16",
    }
    getcomposer.org

    View Slide

  37. •  Instance profile credentials
    •  Credentials file
    •  Environment variables
    •  Hard coding

    View Slide

  38. •  Instance profile credentials
    •  Credentials file
    •  Environment variables
    •  Client configuration

    View Slide

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

    View Slide

  40. •  Instance profile credentials
    •  Credentials file
    •  Environment variables
    •  Client configuration

    View Slide

  41. •  Instance profile credentials
    •  Credentials file
    •  Environment variables
    •  Client Configuration (BEWARE)
    'credentials' =>
    'key' => $yourAccessKeyId
    'secret' => $yourSecretAccessKey

    View Slide

  42. View Slide

  43. php bin/setup.php
    S3 bucket
    DynamoDB table
    Amazon S3
    Amazon
    DynamoDB

    View Slide

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

    View Slide

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

    View Slide

  46. View Slide

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

    View Slide

  48. View Slide

  49. View Slide

  50. View Slide

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

    View Slide

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

    View Slide

  53. $app = new
    $app 'aws' = function
    return new
    'region' => 'us-east-1'
    'S3' => 'version' => '2006-03-01'
    'DynamoDb' => 'version' => '2012-08-10'

    View Slide

  54. View Slide

  55. $app->get '/' function ...

    View Slide

  56. $dynamoDb = $app 'aws' ->createDynamoDb
    $result = $dynamoDb->query
    'TableName' => 'selphpies'
    'Limit' =>
    // ...
    $items = $result 'Items'

    View Slide

  57. $results = $dynamoDb->getPaginator 'Query'
    'TableName' => 'selphpies'
    // ...
    $items = $results->search 'Items[]'

    View Slide

  58. $results = $s3->getPaginator 'ListObjects' ...
    $files = $results->search 'Contents[].Key'

    View Slide

  59. # 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'

    View Slide

  60. http://jmespath.org/
    $result->search ''
    > 'Contents[].Key'
    > '[CommonPrefixes[].Prefix, Contents[].Key][]'
    > 'NextMarker || Contents[-1].Key'

    View Slide

  61. $app->post '/upload' function ...

    View Slide

  62. 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');
    }

    View Slide

  63. $s3 = $app['aws']->createS3();
    $result = $s3->putObject([
    'Bucket' => 'selphpies',
    'Key' => $file->getClientOriginalName(),
    'Body' => fopen($file->getFileName(), 'r'),
    'ACL' => 'public-read',
    ]);

    View Slide

  64. // 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'
    );

    View Slide

  65. $dynamoDb->putItem([
    'TableName' => 'selphpies',
    'Item' => [
    // ...
    'src' => ['S' => $result['ObjectURL']],
    'caption' => ['S' => $caption],
    ],
    ]);

    View Slide

  66. $m = new ();
    $dynamoDb->putItem([
    'TableName' => 'selphpies',
    'Item' => $m->marshalItem([
    // ...
    'src' => $result['ObjectURL’],
    'caption' => $caption,
    ]),
    ]);

    View Slide

  67. PHP
    such php
    so cloud
    wow
    very selfie
    much app
    #phpdoge

    View Slide

  68. github.com/aws/aws-sdk-php/releases
    @awsforphp
    blogs.aws.amazon.com/php

    View Slide

  69. github.com/aws/aws-sdk-php
    forums.aws.amazon.com

    View Slide

  70. By Jeremy Lindblom (@jeremeamia)

    View Slide