使用 AWS PHP SDK
发布于 作者 Chris Fidao
AWS 几乎为所有流行语言(包括 PHP)提供 SDK。这些 SDK 的行为非常相似,使用相同的 API 调用和参数。
通常,SDK 在利用每种语言的优势方面做得很好。
让我们看看如何使用 PHP SDK - 它比你想象的要简单!
配置凭据
所有 AWS SDK 都对 AWS 进行 API 调用。为此,您需要具有正确访问权限的 IAM 凭据才能执行 API 调用请求(IAM 角色和策略)。
假设您拥有运行所需 API 调用的权限,所有 SDK 在检测您可能将凭据传递给 SDK 的各种方式方面都做得很好。
您可以查看 SDK 读取凭据的方法列表。如果您不理解所有方法,请不要担心。
以下是重点
- 您可以 设置环境变量
- 您可以拥有您的
~/.aws/credentials
文件 - 您的环境(EC2 服务器、CodeBuild 环境、Lambda 函数、ECS 环境)可以 “假定”角色(更高级)
还有其他更高级的方式来设置您的凭据,但这些是最常见的。
我通常执行以下操作之一
- 设置环境变量(通过 Laravel 的
.env
文件) - 允许 SDK 读取
~/.aws.credentials
文件,通常用于本地开发
如果您设置了某些环境变量,SDK 会为您完成所有操作。如果您没有设置环境变量,SDK 会自动搜索您的 ~/.aws/credentials
文件。
以下是创建新的 Ec2Client
对象的方式
use Aws\Ec2\Ec2Client; $ec2 = new Ec2Client([ // Region is required if not set by an env var 'region' => 'us-east-2', // API version 'version' => 'latest', // Use a profile from ~/.aws/credentials // 'profile' => 'your-profile-here']);
执行命令
每种语言都有自己的 API 参考文档。 PHP 文档在此处。
我们将看到一个使用 Amazon EC2 API 创建服务器的示例。这将使用 RunInstances
(复数!)API 调用。
以下是创建 EC2 服务器的方式
// $result: ['Location' => 'us-east-2']$result = $ec2->runInstances([ // ImageId: https://cloud-images.ubuntu.com/locator/ec2/ 'ImageId' => 'ami-0b29b6e62f2343b46', 'InstanceType' => 't3.small', // Optional parameters you likely want to define // 'KeyName' => "some-key", // 'SecurityGroupIds' => ['sg-foobar'], // 'SubnetId' => 'subnet-foobar', 'MaxCount' => 1, // You can create multiple servers 'MinCount' => 1, // but we'll just create one // Create the root disk volume 'BlockDeviceMappings' => [ // Can usually assume this is the correct // root device name 'DeviceName' => '/dev/sda1', 'Ebs' => [ 'DeleteOnTermination' => true, 'VolumeSize' => 8, 'VolumeType' => 'gp3', ], ],]);
等待器
SDK 的一个被忽视的功能是“等待器”,它可以让您等待直到资源达到某个状态。
这对于解决您发现自己编写以下内容的情况很有用
while(/* server is not yet running */) { // Check if server is running}
相信我,在编写针对 AWS 的代码时,您最终会编写类似的代码。
等待器并非始终有很好的文档,具体取决于 SDK。幸运的是,PHP 的文档很完善。例如,在 EC2 页面上,我们可以向下滚动查看 可用的等待器。
我们将使用 InstanceRunning
等待器。请注意,它告诉我们该等待器使用 DescribeInstances
API 操作。这意味着我们传递给它的参数是用于该 API 调用的参数。
让我们看看它是什么样的
$result = $ec2->runInstances([/* ... */]); // We only created one instance, so we can assume// the zeroeth array index$instanceId = $result['Instances'][0]['InstanceId']; $ec2->waitUntil('InstanceRunning', [ // Can pass an array of instance ID's // We only have 1 instance 'InstanceIds' => [$instanceId], '@waiter' => [ 'delay' => 3, // Wait 3 seconds between polling 'maxAttempts' => 10, // Max attempts before failing, total of 30 seconds waited here ]]);
这将最多等待 30 秒,直到实例达到“运行”状态。这相当于 3 次尝试,每次尝试之间间隔 10 秒。
如果它没有达到该状态,则会抛出超时异常。
更多示例
如果您有兴趣了解更多示例,此存储库包含跨多个流行语言的 AWS SDK 示例!