【问题标题】:How is it possible to get instance metadata using PHP AWS SDK?如何使用 PHP AWS SDK 获取实例元数据?
【发布时间】:2022-11-06 18:19:00
【问题描述】:

我想使用AWS SDK 获取当前 EC2 的实例元数据(如 AZ)。 我能够找到an alternative solution,但它没有使用SDK,只是file_get_contents SDK怎么可能?

【问题讨论】:

  • AWS 开发工具包不包含任何用于访问实例元数据的公共方法。您必须使用 SDK 之外的某种方法直接访问它。

标签: php amazon-web-services amazon-ec2 aws-php-sdk


【解决方案1】:

通过当前的 EC2 实例,您是指在 EC2 上运行的 PHP 代码,并且您想将该元数据注入一些变量以供使用?

或者您的意思是您有一个使用 PHP SDK 创建的对象,例如:

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

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

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

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

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

【讨论】:

  • 我的意思是在 EC2 上运行的 PHP 代码
【解决方案2】:

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

除非我遗漏了什么,否则您需要自己提取这些数据或使用一些在 PHP 中为您执行此操作的第三方库。

【讨论】:

    【解决方案3】:

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

    为此,您必须使用需要两个 CURL 命令的 IMDSv2,第一个用于获取 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";
    

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 1970-01-01
      • 2016-12-23
      • 2022-12-09
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      相关资源
      最近更新 更多