如何使用PHP AWS SDK获取实例元数据



我想使用AWS SDK获取当前EC2的实例元数据(如AZ(。我找到了另一种解决方案,但它并不是使用SDK,而是使用file_get_contentsSDK是如何实现的?

JasonQ AWS提出的解决方案对于获取帐户中所有实例和应用程序的信息非常有用。但是,它不会告诉您哪些信息描述了当前进程真正执行的实例。

为此,您必须使用IMDSv2,它需要两个CURL命令,第一个用于获取TOKEN,第二个用于获取当前实例的实际元数据。

因此,在PHP中,代码可以是:

$ch = curl_init();
// get a valid TOKEN
$headers = array (
'X-aws-ec2-metadata-token-ttl-seconds: 10' );
$url = "http://169.254.169.254/latest/api/token";
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, "PUT" );
curl_setopt( $ch, CURLOPT_URL, $url );
$token = curl_exec( $ch );
echo "<p> TOKEN :" . $token;
// then get metadata of the current instance 
$headers = array (
'X-aws-ec2-metadata-token: '.$token );
$url = "http://169.254.169.254/latest/dynamic/instance-identity/document";
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, "GET" );
$result = curl_exec( $ch );
echo "<p> RESULT :" . $result;

你所要做的就是提取所需的信息。您还可以要求提供一个唯一的信息,例如带有更具体url的实例id,如:

$url = "http://169.254.169.254/latest/meta-data/instance-id";

对于当前的EC2实例,您是否指的是在EC2上运行的PHP代码,并且您希望将该元数据注入到一些变量中以供使用?

或者你的意思是你有一个用PHP SDK创建的对象,比如用

$ec2Client = new AwsEc2Ec2Client([
'region' => 'us-east-1',
'version' => 'latest'
]);

如果你的意思是第二种方式,你可以通过describeInstances访问数据,如下所示:

$result = $ec2Client->describeInstances();
echo "Instances: n";
foreach ($result['Reservations'] as $reservation) {
foreach ($reservation['Instances'] as $instance) {
echo "InstanceId: {$instance['InstanceId']} - {$instance['State']['Name']} n";
echo "Availability Zone: {$instance['Placement']['AvailabilityZone']} n";
}
echo "n";
}

您还可以通过向方法调用添加参数(如按类型或instanceId(进行筛选。

如果你只是在EC2实例上运行PHP代码,并且你想要这些信息,你可以查看这个页面以获得一些选项:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html

我认为这根本不可能。IMDSv2信息,如AZ、实例id、实例类型等,可通过https://169.254.169.254如果你查看SDK的源代码,它只会通过IMDSv2获取临时凭据(https://github.com/aws/aws-sdk-php/search?q=169.254)并且不允许任意的IMDSv2查询。

除非我遗漏了什么,否则你需要自己提取这些数据,或者使用一些第三方库,它可以在PHP中为你做到这一点。

最新更新