AWS Secrets Manager 异常访问被拒绝
AWS Secrets Manager Exception AccessDenied
问题简单说明:
当我的 Web 应用程序 API 调用 AWS Secrets Manager 以获取机密 keys/data.
时,我收到此 AWSSecretsManagerException AccessDenied
问题更详细一点:
我有一个部署到 AWS ElasticBeanstalk 的 Web 应用程序 war 文件。我在 AWS Amplify 上有一个前端 React 应用程序,它向 WAR 文件发出 HTTPS 请求。
作为处理此请求的一部分,Web 应用程序连接到 PayPal 的 API。要成功请求使用 PayPal 的 API,我需要一个 令牌。要获得该令牌,我的网络应用程序需要通过发送我的 Pay Pal 客户端 ID 和 [=32= 向 PayPal 发出请求以获取该 令牌 ]密钥。
为了不将其硬编码到应用程序中或以纯文本形式包含该客户端 ID 和密钥的本地配置文件,我决定使用 AWS Secrets Manager 将它们存储在 AWS 中。要访问存储在我的应用程序中的密钥,我需要使用 AWS Secrets Manager SDK。我通过将此依赖项包含在我的 Web 应用程序 pom 文件中来做到这一点。
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-secretsmanager</artifactId>
<version>1.11.700</version>
</dependency>
然后我添加了代码以使用 AWS Secrets Manager SDK API 检索客户端 ID 和密码 API。
当我 运行 我的 Web 应用程序本地在我的 Payara 服务器上的机器上运行时。这意味着我的机器上有一个本地 React 应用程序,它的 HTTP 请求转到我在 Payara(而不是在 AWS 上)上的本地 Web 应用程序,并且该 Web 应用程序成功地从 AWS Secrets Manager 中提取了客户端 ID 和机密。
但是,当我将我的 Web 应用程序部署到 Elastic Beanstalk EC2 实例时,我从我在 AWS Amplify 上的前端 React 应用程序得到了上述异常。
几个小时后我解决了问题。
首先你要注意Exception中列出的角色(看粗体字):
com.amazonaws.services.secretsmanager.model.AWSSecretsManagerException:
User:
arn:aws:sts::<......>:assumed-role/aws-elasticbeanstalk-ec2-role/<.....>
is not authorized to perform: secretsmanager:GetSecretValue on
resource:
arn:aws:secretsmanager:us-east-1:<......>:secret:<.....>
(Service: AWSSecretsManager; Status Code: 400; Error Code:
AccessDeniedException; Request ID:
<.......>)
当您在 AWS 控制台中时,转到 AWS->IAM。从那里单击左侧的 roles link。请注意,此处列出了上面粗体文本中的角色(用红色圈出的文本)。
双击它。
在这个截图中我已经做到了,但最初 SecretsManagerReadWrite 策略(红色圆圈)不存在。
要获取该策略,请单击 "Attach Policies"。然后在下一页搜索 SecretsManagerReadWrite,然后单击复选框。单击 "Attach Policy" 按钮,现在该角色已拥有!
现在,我从 AWS Amplify 上的 React 应用程序发出的 HTTPS 请求向我在 ElasticBeanstalk 上的 Web 应用程序发出请求,我不再收到 AWSSecretsManagerException AccessDenied 消息!
问题简单说明:
当我的 Web 应用程序 API 调用 AWS Secrets Manager 以获取机密 keys/data.
时,我收到此 AWSSecretsManagerException AccessDenied问题更详细一点:
我有一个部署到 AWS ElasticBeanstalk 的 Web 应用程序 war 文件。我在 AWS Amplify 上有一个前端 React 应用程序,它向 WAR 文件发出 HTTPS 请求。
作为处理此请求的一部分,Web 应用程序连接到 PayPal 的 API。要成功请求使用 PayPal 的 API,我需要一个 令牌。要获得该令牌,我的网络应用程序需要通过发送我的 Pay Pal 客户端 ID 和 [=32= 向 PayPal 发出请求以获取该 令牌 ]密钥。
为了不将其硬编码到应用程序中或以纯文本形式包含该客户端 ID 和密钥的本地配置文件,我决定使用 AWS Secrets Manager 将它们存储在 AWS 中。要访问存储在我的应用程序中的密钥,我需要使用 AWS Secrets Manager SDK。我通过将此依赖项包含在我的 Web 应用程序 pom 文件中来做到这一点。
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-secretsmanager</artifactId>
<version>1.11.700</version>
</dependency>
然后我添加了代码以使用 AWS Secrets Manager SDK API 检索客户端 ID 和密码 API。
当我 运行 我的 Web 应用程序本地在我的 Payara 服务器上的机器上运行时。这意味着我的机器上有一个本地 React 应用程序,它的 HTTP 请求转到我在 Payara(而不是在 AWS 上)上的本地 Web 应用程序,并且该 Web 应用程序成功地从 AWS Secrets Manager 中提取了客户端 ID 和机密。
但是,当我将我的 Web 应用程序部署到 Elastic Beanstalk EC2 实例时,我从我在 AWS Amplify 上的前端 React 应用程序得到了上述异常。
几个小时后我解决了问题。
首先你要注意Exception中列出的角色(看粗体字):
com.amazonaws.services.secretsmanager.model.AWSSecretsManagerException: User: arn:aws:sts::<......>:assumed-role/aws-elasticbeanstalk-ec2-role/<.....> is not authorized to perform: secretsmanager:GetSecretValue on resource: arn:aws:secretsmanager:us-east-1:<......>:secret:<.....> (Service: AWSSecretsManager; Status Code: 400; Error Code: AccessDeniedException; Request ID: <.......>)
当您在 AWS 控制台中时,转到 AWS->IAM。从那里单击左侧的 roles link。请注意,此处列出了上面粗体文本中的角色(用红色圈出的文本)。
双击它。
在这个截图中我已经做到了,但最初 SecretsManagerReadWrite 策略(红色圆圈)不存在。
要获取该策略,请单击 "Attach Policies"。然后在下一页搜索 SecretsManagerReadWrite,然后单击复选框。单击 "Attach Policy" 按钮,现在该角色已拥有!
现在,我从 AWS Amplify 上的 React 应用程序发出的 HTTPS 请求向我在 ElasticBeanstalk 上的 Web 应用程序发出请求,我不再收到 AWSSecretsManagerException AccessDenied 消息!