Slide 1

Slide 1 text

By Jeremy Lindblom (@jeremeamia)

Slide 2

Slide 2 text

Jeremy Lindblom (@jeremeamia)

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

•  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

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

PHP PHP #nofilter #selphpie #instagood

Slide 16

Slide 16 text

PHP PHP

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

By Jeremy Lindblom (@jeremeamia)