如何在EC2启动模板中通过PHP获取SecretsManager存储的密钥
解决方案:通过EC2实例角色自动访问AWS Secrets Manager
问题根源
你的PHP代码指定了'profile' => 'default',这会强制AWS SDK读取本地~/.aws/credentials文件,但使用EC2实例IAM角色时,SDK可以自动从实例元数据服务(IMDS)获取临时凭证,完全不需要手动创建credentials文件。
1. 修改PHP代码(核心修复)
删除profile参数,让SDK自动使用实例角色的凭证:
$client = new SecretsManagerClient([ 'version' => '2017-10-17', 'region' => 'eu-central-1', ]); try { $result = $client->getSecretValue([ 'SecretId' => $secret_name, ]); } catch (AwsException $e) { $error = $e->getAwsErrorCode(); if ($error == 'DecryptionFailureException') { throw $e; } if ($error == 'InternalServiceErrorException') { throw $e; } if ($error == 'InvalidParameterException') { throw $e; } if ($error == 'InvalidRequestException') { throw $e; } if ($error == 'ResourceNotFoundException') { throw $e; } } // 解密并返回密钥内容 if (isset($result['SecretString'])) { $secret = $result['SecretString']; } else { $secret = base64_decode($result['SecretBinary']); } return json_decode($secret, true);
2. 配置EC2启动模板的IAM角色
确保启动模板关联具备SecretsManager访问权限的IAM角色:
- 创建或复用现有IAM角色,附加包含以下权限的策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:eu-central-1:你的AWS账号ID:secret:你的密钥名称-*" }, { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:eu-central-1:你的AWS账号ID:key/你的KMS密钥ID" } ] }注意:如果密钥使用AWS托管KMS密钥(默认创建的密钥),可省略KMS权限;若使用自定义KMS密钥,必须添加
kms:Decrypt权限。 - 在EC2启动模板的**"IAM实例配置文件"**选项中,选择该IAM角色对应的实例配置文件(实例配置文件是IAM角色的容器,用于绑定到EC2实例)。
3. 验证实例角色生效
实例启动后,可通过以下命令测试元数据服务是否返回临时凭证:
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/你的IAM角色名称
若返回包含AccessKeyId、SecretAccessKey、Token的JSON,说明角色配置正常。
4. (可选)User Data预安装依赖
如果实例需要安装AWS PHP SDK,可在启动模板的User Data中添加安装命令(以Amazon Linux 2为例):
#!/bin/bash yum install -y php php-cli php-curl curl -sS https://getcomposer.org/installer | php php composer.phar require aws/aws-sdk-php
内容的提问来源于stack exchange,提问作者FroddeB
相关产品推荐
相关产品推荐

