【问题标题】:AWS: How to get PHP on an EC2 instance to read a Secrets Manager secret?AWS:如何让 EC2 实例上的 PHP 读取 Secrets Manager 密钥?
【发布时间】:2020-08-11 03:34:14
【问题描述】:

我已经设置了一个运行 PHP 的 EC2 实例。仅用于测试,实例位于公共子网中,其安全组允许所有流量流向0.0.0.0/0。路由表具有到 10.0.0.0/16(VPC 的 CIDR 块)的默认本地路由和到 0.0.0.0/0 的 Internet 网关的路由。与子网关联的 NACL 允许所有流量在 0.0.0.0/0 进出。我知道这很开放,但我想确保我遇到的问题与安全组和 NACL 无关。

我创建了一个 Secrets Manager 密钥 MySecret-xxxxx,并使用以下策略将 IAM 角色附加到实例以允许实例访问该密钥:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": "arn:aws:secretsmanager:eu-west-2:xxxxxxxxx:secret:MySecret-xxxxx"
        }
    ]
}

我已经在实例上的一个名为 sdks 的子文件夹中安装了适用于 PHP 的 AWS 开发工具包,最后创建了一个运行良好的“Hello World”index.php 文件,直到我尝试以简化的方式运行 getSecretValue AWS 提供的设置信息的版本。这是PHP代码:

<?php
    require 'sdks/aws/aws-autoloader.php';

    use Aws\SecretsManager\SecretsManagerClient;
    use Aws\Exception\AwsException;

    $client = new SecretsManagerClient( [
        'profile' => 'default',
        'version' => 'latest',
        'region' => 'eu-west-2'
    ] );

    $secretName = 'MySecret-xxxxx';

    echo '<h1>Hello World</h1>';

    $result = $client->getSecretValue([
        'SecretId' => $secretName,
    ]);
?>

只要我包含 $result = $client-&gt;getSecretValue([... 代码块,我就会收到一条 HTTP ERROR 500 错误消息,尽管没有它它工作得很好。我在 CLI 上运行 aws secretsmanager get-secret-value --secret-id MySecret-xxxxx --region eu-west-2 并正确返回了秘密详细信息。

【问题讨论】:

    标签: php amazon-web-services amazon-ec2 amazon-iam aws-secrets-manager


    【解决方案1】:

    终于弄明白了——虽然我在 EC2 实例的 /home/ec2-user/.aws 文件夹中创建了一个凭证文件,但我仍然必须通过 SDK 检索凭证。为什么这不包括在 AWS 提供的 Secrets Manager 示例代码中,这超出了我的理解。完整的工作代码现在如下所示:

    <?php
        require 'vendor/autoload.php';
    
        use Aws\Credentials\CredentialProvider;
        use Aws\SecretsManager\SecretsManagerClient;
        use Aws\Exception\AwsException;
    
        $provider = CredentialProvider::defaultProvider();
    
        $client = new SecretsManagerClient( [
            'credentials' => $provider,
            'version' => 'latest',
            'region' => 'eu-west-2'
        ] );
    
        $secretName = 'MySecret-xxxxx';
    
        try {
            $result = $client->getSecretValue( [
                'SecretId' => $secretName,
            ] );
        } catch ( AwsException $e ) {
            $error = $e->getAwsErrorCode();
            if ( $error == 'DecryptionFailureException' ) { // Can't decrypt the protected secret text using the provided AWS KMS key.
                throw $e;
            }
            if ( $error == 'InternalServiceErrorException' ) { // An error occurred on the server side.
                throw $e;
            }
            if ( $error == 'InvalidParameterException' ) { // Invalid parameter value.
                throw $e;
            }
            if ( $error == 'InvalidRequestException' ) { // Parameter value is not valid for the current state of the resource.
                throw $e;
            }
            if ( $error == 'ResourceNotFoundException' ) { // Requested resource not found
                throw $e;
            }
        }
        // Decrypts secret using the associated KMS CMK, depends on whether the secret is a string or binary.
        if ( isset( $result[ 'SecretString' ] ) ) {
            $secret = $result[ 'SecretString' ];
        } else {
            $secret = base64_decode( $result[ 'SecretBinary' ] );
        }
    
        // Decode the secret json
        $secrets = json_decode( $secret, true );
    
    echo( '<p>hostname/ipaddress: ' . $secrets[ 'host' ] . '</p><p>username: ' . $secrets[ 'username' ] . '</p><p>password: ' . $secrets[ 'password' ] . '</p><p>dbname: ' . $secrets[ 'dbname' ] . '</p>' );
    

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 2019-02-15
      • 2020-09-29
      • 1970-01-01
      • 2020-08-14
      • 2020-01-09
      • 2021-10-29
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多