Cloudify your applications with Amazon Web Services
1. Cloudify your applications with Amazon Web Services
Federico Feroldi, Cloudify
phpDay 2009 - May 15, 16 2009 - Verona, Italy
http://grusp.it - http://phpday.it - http://joind.in/event/view/34
2. Before we start
Feel free to ask questions!
phpDay 2009 - May 15, 16 2009 - Verona, Italy
3. About me
“I’m a technologist, I like to
find simple solutions to
solve hard challenges”
Federico Feroldi
phpDay 2009 - May 15, 16 2009 - Verona, Italy
4. About me: the beginning
First BASIC program at
7 years old on my
Commodore 64
phpDay 2009 - May 15, 16 2009 - Verona, Italy
5. About me: coding for fun
Had fun during late 90s
DemoScene coding
realtime GFX in C and
i386 assembly
phpDay 2009 - May 15, 16 2009 - Verona, Italy
6. About me: work experience
Working in the Internet
industry since 1996 for
many small and big
companies
phpDay 2009 - May 15, 16 2009 - Verona, Italy
7. About me: thinking big
6 years in Yahoo!
Member of the intl
MyYahoo team during
the rewriting project,
from C++/Perl to PHP
+ C++ extensions
phpDay 2009 - May 15, 16 2009 - Verona, Italy
8. About me: the future
Founded Cloudify in
January 2009, helping
customers unleash the
power of cloud computing
technologies
http://cloudify.me
phpDay 2009 - May 15, 16 2009 - Verona, Italy
10. Agenda
• The cloud advantage
phpDay 2009 - May 15, 16 2009 - Verona, Italy
11. Agenda
• The cloud advantage
• Overview of Amazon Web Services
phpDay 2009 - May 15, 16 2009 - Verona, Italy
12. Agenda
• The cloud advantage
• Overview of Amazon Web Services
• Amazon Web Services and PHP
phpDay 2009 - May 15, 16 2009 - Verona, Italy
13. Agenda
• The cloud advantage
• Overview of Amazon Web Services
• Amazon Web Services and PHP
• Examples
phpDay 2009 - May 15, 16 2009 - Verona, Italy
14. The cloud: a definition
phpDay 2009 - May 15, 16 2009 - Verona, Italy
15. The cloud: a definition
NIST Working Definition of Cloud Computing
phpDay 2009 - May 15, 16 2009 - Verona, Italy
16. The cloud: a definition
NIST Working Definition of Cloud Computing
“Cloud computing is a pay-per-use model for
enabling available, convenient, on-demand network
access to a shared pool of configurable computing
resources (e.g., networks, servers, storage,
applications, services) that can be rapidly provisioned
and released with minimal management effort or
service provider interaction.”
http://tinyurl.com/qjfonl
phpDay 2009 - May 15, 16 2009 - Verona, Italy
17. The cloud: a definition
NIST Working Definition of Cloud Computing
“Cloud computing is a pay-per-use model for
enabling available, convenient, on-demand network
access to a shared pool of configurable computing
resources (e.g., networks, servers, storage,
applications, services) that can be rapidly provisioned
and released with minimal management effort or
service provider interaction.”
http://tinyurl.com/qjfonl
phpDay 2009 - May 15, 16 2009 - Verona, Italy
18. The cloud: optimize resource usage
100
75
Systems usage
Idle
50
25
Active
0
Time
phpDay 2009 - May 15, 16 2009 - Verona, Italy
19. The cloud: optimize resource usage
100
Cloud
75
Systems usage
50
Idle
25
Active
0
Time
phpDay 2009 - May 15, 16 2009 - Verona, Italy
20. The cloud: you can scale FAST!
Animoto server > 3500
instances grew from
less than 80 to more
than 3500 in 3 days
after launch of
Facebook application < 80
http://tinyurl.com/6fa7qo
phpDay 2009 - May 15, 16 2009 - Verona, Italy
21. The cloud advantage
cloud platform
phpDay 2009 - May 15, 16 2009 - Verona, Italy
22. The cloud advantage
Technology
cloud platform
phpDay 2009 - May 15, 16 2009 - Verona, Italy
23. The cloud advantage
Technology
cloud platform Speed
phpDay 2009 - May 15, 16 2009 - Verona, Italy
24. The cloud advantage
Technology
cloud platform Speed
Flexibility
phpDay 2009 - May 15, 16 2009 - Verona, Italy
25. The cloud advantage
Technology
Cost cloud platform Speed
Flexibility
phpDay 2009 - May 15, 16 2009 - Verona, Italy
44. EC2
Amazon Web Services: EC2
• Create or destroy instances in minutes
phpDay 2009 - May 15, 16 2009 - Verona, Italy
45. EC2
Amazon Web Services: EC2
• Create or destroy instances in minutes
• Many sizes: 1-20 Core(s) , 1.7-15GB RAM
phpDay 2009 - May 15, 16 2009 - Verona, Italy
46. EC2
Amazon Web Services: EC2
• Create or destroy instances in minutes
• Many sizes: 1-20 Core(s) , 1.7-15GB RAM
• You can create custom VM images (AMI)
phpDay 2009 - May 15, 16 2009 - Verona, Italy
47. EC2
Amazon Web Services: EC2
• Create or destroy instances in minutes
• Many sizes: 1-20 Core(s) , 1.7-15GB RAM
• You can create custom VM images (AMI)
• Fixed IPs, persistent volumes, snapshots
phpDay 2009 - May 15, 16 2009 - Verona, Italy
48. EC2
Amazon Web Services: EC2
• Create or destroy instances in minutes
• Many sizes: 1-20 Core(s) , 1.7-15GB RAM
• You can create custom VM images (AMI)
• Fixed IPs, persistent volumes, snapshots
• You pay cpu time and data transferred
phpDay 2009 - May 15, 16 2009 - Verona, Italy
50. Amazon Web Services: S3 S3
• Create a bucket and put objects inside
phpDay 2009 - May 15, 16 2009 - Verona, Italy
51. Amazon Web Services: S3 S3
• Create a bucket and put objects inside
• http://s3.amazonaws.com/bucket/object
or http://xxx.yoursite.com/object
phpDay 2009 - May 15, 16 2009 - Verona, Italy
52. Amazon Web Services: S3 S3
• Create a bucket and put objects inside
• http://s3.amazonaws.com/bucket/object
or http://xxx.yoursite.com/object
• You can put an infinite number of objects in
a bucket, objects have 5GB size limit
phpDay 2009 - May 15, 16 2009 - Verona, Italy
53. Amazon Web Services: S3 S3
• Create a bucket and put objects inside
• http://s3.amazonaws.com/bucket/object
or http://xxx.yoursite.com/object
• You can put an infinite number of objects in
a bucket, objects have 5GB size limit
• You pay storage, data transferred and
operations
phpDay 2009 - May 15, 16 2009 - Verona, Italy
54. Amazon Web Services: SimpleDB
SimpleDB
phpDay 2009 - May 15, 16 2009 - Verona, Italy
55. Amazon Web Services: SimpleDB
SimpleDB
• Key/Value store (not relational)
phpDay 2009 - May 15, 16 2009 - Verona, Italy
56. Amazon Web Services: SimpleDB
SimpleDB
• Key/Value store (not relational)
• Domains, Items and Attributes
phpDay 2009 - May 15, 16 2009 - Verona, Italy
57. Amazon Web Services: SimpleDB
SimpleDB
• Key/Value store (not relational)
• Domains, Items and Attributes
• Very simple query language (no JOINs)
phpDay 2009 - May 15, 16 2009 - Verona, Italy
58. Amazon Web Services: SimpleDB
SimpleDB
• Key/Value store (not relational)
• Domains, Items and Attributes
• Very simple query language (no JOINs)
• You pay storage, data transferred and
operations
phpDay 2009 - May 15, 16 2009 - Verona, Italy
60. Amazon Web Services: SQS
SQS
• Implements message queing service
phpDay 2009 - May 15, 16 2009 - Verona, Italy
61. Amazon Web Services: SQS
SQS
• Implements message queing service
• Useful to build asyncronous workers and
offload web servers
phpDay 2009 - May 15, 16 2009 - Verona, Italy
62. Amazon Web Services: SQS
SQS
• Implements message queing service
• Useful to build asyncronous workers and
offload web servers
• You pay messages and data transferred
phpDay 2009 - May 15, 16 2009 - Verona, Italy
63. AWS and PHP
How do I build my PHP application on AWS?
phpDay 2009 - May 15, 16 2009 - Verona, Italy
64. AWS and PHP: Amazon libraries
phpDay 2009 - May 15, 16 2009 - Verona, Italy
65. AWS and PHP: Amazon libraries
Amazon “official” PHP libraries
✓ support all services
✓ many tutorials available
- verbose and often incostintent syntax
- not very well documented
phpDay 2009 - May 15, 16 2009 - Verona, Italy
66. AWS and PHP: Tarzan AWS
✓ full AWS support (S3, EC2, SQS,
SimpleDB, CloudFront)
✓ clean, consistent API
✓ well documented
http://tarzan-aws.com/
phpDay 2009 - May 15, 16 2009 - Verona, Italy
67. Examples: Upload a file to S3
<?php
require_once('tarzan.class.php');
$s3 = new AmazonS3();
$bucket = $s3->create_bucket('tarzan.test', S3_LOCATION_EU);
$file_url = $s3->store_remote_file(
'file://local.jpg',
'tarzan.test', 'remote.jpg', array( 'acl' => S3_ACL_PUBLIC)
);
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
68. Examples: Upload a file to S3
<?php
require_once('tarzan.class.php');
Include Tarzan
core class
$s3 = new AmazonS3();
$bucket = $s3->create_bucket('tarzan.test', S3_LOCATION_EU);
$file_url = $s3->store_remote_file(
'file://local.jpg',
'tarzan.test', 'remote.jpg', array( 'acl' => S3_ACL_PUBLIC)
);
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
69. Examples: Upload a file to S3
<?php
require_once('tarzan.class.php');
$s3 = new AmazonS3();
$bucket = $s3->create_bucket('tarzan.test', S3_LOCATION_EU);
$file_url = $s3->store_remote_file(
'file://local.jpg',
'tarzan.test', 'remote.jpg', array( 'acl' => S3_ACL_PUBLIC)
);
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
71. Examples: Upload a file to S3
<?php
require_once('tarzan.class.php');
$s3 = new AmazonS3();
$bucket = $s3->create_bucket('tarzan.test', S3_LOCATION_EU);
$file_url = $s3->store_remote_file(
'file://local.jpg',
'tarzan.test', 'remote.jpg', array( 'acl' => S3_ACL_PUBLIC)
);
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
72. Examples: Upload a file to S3
<?php
Create a new bucket that
require_once('tarzan.class.php');
will contain the file
$s3 = new AmazonS3();
$bucket = $s3->create_bucket('tarzan.test', S3_LOCATION_EU);
$file_url = $s3->store_remote_file(
'file://local.jpg',
'tarzan.test', 'remote.jpg', array( 'acl' => S3_ACL_PUBLIC)
);
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
73. Examples: Upload a file to S3
<?php
require_once('tarzan.class.php');
$s3 = new AmazonS3();
$bucket = $s3->create_bucket('tarzan.test', S3_LOCATION_EU);
$file_url = $s3->store_remote_file(
'file://local.jpg',
'tarzan.test', 'remote.jpg', array( 'acl' => S3_ACL_PUBLIC)
);
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
74. Examples: Upload a file to S3
<?php
require_once('tarzan.class.php');
Upload a local file to S3
$s3 = new AmazonS3();
and make it public
$bucket = $s3->create_bucket('tarzan.test', S3_LOCATION_EU);
$file_url = $s3->store_remote_file(
'file://local.jpg',
'tarzan.test', 'remote.jpg', array( 'acl' => S3_ACL_PUBLIC)
);
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
75. Examples: Upload a file to S3
<?php
require_once('tarzan.class.php');
$s3 = new AmazonS3();
$bucket = $s3->create_bucket('tarzan.test', S3_LOCATION_EU);
$file_url = $s3->store_remote_file(
'file://local.jpg',
'tarzan.test', 'remote.jpg', array( 'acl' => S3_ACL_PUBLIC)
);
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
76. Examples: Get a file from S3
<?php
require_once('tarzan.class.php');
$s3 = new AmazonS3();
$file = $s3->get_object('tarzan.test', 'remote.jpg');
header('Content-type:' . $file->headers['content-type']);
echo $file->body;
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
77. Examples: Get a file from S3
<?php
Get a handler to a
require_once('tarzan.class.php');
remote file
$s3 = new AmazonS3();
$file = $s3->get_object('tarzan.test', 'remote.jpg');
header('Content-type:' . $file->headers['content-type']);
echo $file->body;
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
78. Examples: Get a file from S3
<?php
require_once('tarzan.class.php');
$s3 = new AmazonS3();
$file = $s3->get_object('tarzan.test', 'remote.jpg');
header('Content-type:' . $file->headers['content-type']);
echo $file->body;
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
79. Examples: Get a file from S3
<?php
require_once('tarzan.class.php');
Output the file
$s3 = new AmazonS3();
content to the client
$file = $s3->get_object('tarzan.test', 'remote.jpg');
header('Content-type:' . $file->headers['content-type']);
echo $file->body;
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
80. Examples: Get a file from S3
<?php
require_once('tarzan.class.php');
$s3 = new AmazonS3();
$file = $s3->get_object('tarzan.test', 'remote.jpg');
header('Content-type:' . $file->headers['content-type']);
echo $file->body;
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
86. Examples: Run an EC2 instance
<?php
require_once('tarzan.class.php');
$ec2 = new AmazonEC2();
Allocate an Elastic IP (fixed public IP) and
associate it with the instance created
$run = $ec2->run_instances('ef48af86', 1, 1);
$instance_id = $run->body->instancesSet->item->instanceId;
$allocate = $ec2->allocate_address();
$ip_addr = $allocate->body->publicIp;
$associate = $ec2->associate_address($instance_id, $ip_addr);
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
122. Examples: Simple Queing Service
<?php
require_once('tarzan.class.php');
$sqs = new AmazonSQS();
$queue = $sqs->create_queue('tarzan_test_queue');
$message = $sqs->send_message('This is my message!');
$message = $sqs->receive_message();
$message = $sqs->delete_message($message_id);
$queue = $sqs->delete_queue();
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
123. Examples: Simple Queing Service
<?php
require_once('tarzan.class.php');
$sqs = new AmazonSQS(); Create the queue
$queue = $sqs->create_queue('tarzan_test_queue');
$message = $sqs->send_message('This is my message!');
$message = $sqs->receive_message();
$message = $sqs->delete_message($message_id);
$queue = $sqs->delete_queue();
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
124. Examples: Simple Queing Service
<?php
require_once('tarzan.class.php');
$sqs = new AmazonSQS();
$queue = $sqs->create_queue('tarzan_test_queue');
$message = $sqs->send_message('This is my message!');
$message = $sqs->receive_message();
$message = $sqs->delete_message($message_id);
$queue = $sqs->delete_queue();
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
125. Examples: Simple Queing Service
<?php
require_once('tarzan.class.php');
$sqs = new AmazonSQS();
Push a message into the queue
$queue = $sqs->create_queue('tarzan_test_queue');
$message = $sqs->send_message('This is my message!');
$message = $sqs->receive_message();
$message = $sqs->delete_message($message_id);
$queue = $sqs->delete_queue();
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
126. Examples: Simple Queing Service
<?php
require_once('tarzan.class.php');
$sqs = new AmazonSQS();
$queue = $sqs->create_queue('tarzan_test_queue');
$message = $sqs->send_message('This is my message!');
$message = $sqs->receive_message();
$message = $sqs->delete_message($message_id);
$queue = $sqs->delete_queue();
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
127. Examples: Simple Queing Service
<?php
require_once('tarzan.class.php');
$sqs = new AmazonSQS();
Remove temporaly a
$queue = $sqs->create_queue('tarzan_test_queue');
message from the queue
$message = $sqs->send_message('This is my message!');
$message = $sqs->receive_message();
$message = $sqs->delete_message($message_id);
$queue = $sqs->delete_queue();
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
128. Examples: Simple Queing Service
<?php
require_once('tarzan.class.php');
$sqs = new AmazonSQS();
$queue = $sqs->create_queue('tarzan_test_queue');
$message = $sqs->send_message('This is my message!');
$message = $sqs->receive_message();
$message = $sqs->delete_message($message_id);
$queue = $sqs->delete_queue();
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
129. Examples: Simple Queing Service
<?php
require_once('tarzan.class.php');
$sqs = new AmazonSQS();
$queue = $sqs->create_queue('tarzan_test_queue');
Remove permanently the
$message = $sqs->send_message('This is my message!');
$message =
message from the queue
$sqs->receive_message();
$message = $sqs->delete_message($message_id);
$queue = $sqs->delete_queue();
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
130. Examples: Simple Queing Service
<?php
require_once('tarzan.class.php');
$sqs = new AmazonSQS();
$queue = $sqs->create_queue('tarzan_test_queue');
$message = $sqs->send_message('This is my message!');
$message = $sqs->receive_message();
$message = $sqs->delete_message($message_id);
$queue = $sqs->delete_queue();
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
131. Examples: Simple Queing Service
<?php
require_once('tarzan.class.php');
$sqs = new AmazonSQS();
$queue = $sqs->create_queue('tarzan_test_queue');
$message = $sqs->send_message('This is my message!');
$message = $sqs->receive_message();
Destroy the queue
$message = $sqs->delete_message($message_id);
$queue = $sqs->delete_queue();
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
132. Examples: Simple Queing Service
<?php
require_once('tarzan.class.php');
$sqs = new AmazonSQS();
$queue = $sqs->create_queue('tarzan_test_queue');
$message = $sqs->send_message('This is my message!');
$message = $sqs->receive_message();
$message = $sqs->delete_message($message_id);
$queue = $sqs->delete_queue();
?>
phpDay 2009 - May 15, 16 2009 - Verona, Italy
133. What we have learned?
The cloud is real and it takes less than 5
minutes to start using it in you applications!
With Tarzan you can easily integrate the
powerful Amazon Web Services into you
application or start build one on them.
phpDay 2009 - May 15, 16 2009 - Verona, Italy
134. Thank you! Questions?
http://cloudify.me
info@cloudify.me
@cloudify
We’re hiring, send your resume to jobs@cloudify.me
phpDay 2009 - May 15, 16 2009 - Verona, Italy