使用 AWS Secrets Manager 管理 APM 认证密钥
编辑使用 AWS Secrets Manager 管理 APM 认证密钥编辑
当使用配置选项 ELASTIC_APM_SECRET_TOKEN
或 ELASTIC_APM_API_KEY
来认证 Elastic APM AWS Lambda 扩展时,相应的密钥以纯文本形式指定在 Lambda 函数的环境变量中。如果您希望安全地存储认证密钥,可以使用 AWS Secrets Manager,并让扩展从 AWS Secrets Manager 中检索实际密钥。请按照以下说明设置 AWS Secrets Manager 和扩展。
步骤 1:在 AWS Secrets Manager 中创建密钥。编辑
在 AWS Secrets Manager 中 创建密钥 用于 APM 密钥令牌 或 APM API 密钥,具体取决于您希望使用哪一个。确保将密钥创建为 纯文本 类型的密钥,并确保它是在与使用该密钥的目标 Lambda 函数 相同的 AWS 区域 中创建的。
我们建议使用 AWS 管理的加密密钥 aws/secretsmanager
。但是,您可以选择创建和选择自定义 KMS 密钥进行加密。请注意,使用自定义加密密钥,您需要在 Lambda 函数上添加额外的密钥权限(请参阅 步骤 2)。
在 AWS Secrets Manager 的 Web 控制台中,导航到 存储新密钥
,选择 其他类型的密钥
作为密钥类型,并选择 纯文本
选项卡来输入密钥值。将您的 APM 密钥令牌或 APM API 密钥值作为纯字符串输入(不是 作为 JSON 密钥值对)。
单击 下一步
,选择密钥名称,并完成密钥的创建。
执行以下命令在 AWS Secrets Manager 中为您的 APM 密钥令牌或 APM API 密钥创建密钥
AWS 无服务器应用程序模型 (SAM) 不提供在 AWS Secrets Manager 中创建密钥的方法。请使用其他选项来创建密钥。
无服务器框架不提供在 AWS Secrets Manager 中创建密钥的方法。请使用其他选项来创建密钥。
将以下资源添加到您的 terraform 文件中,以在 AWS Secrets Manager 中为您的 APM 密钥令牌或 APM API 密钥创建密钥
请记住您选择的密钥名称。您将在配置 Elastic APM AWS Lambda 扩展时使用该密钥名称作为配置选项 ELASTIC_APM_SECRETS_MANAGER_SECRET_TOKEN_ID
或 ELASTIC_APM_SECRETS_MANAGER_API_KEY_ID
的值。
步骤 2:向您的 AWS Lambda 函数添加权限编辑
为了使您的 Lambda 函数能够从 AWS Secrets Manager 中检索认证密钥,您需要向您的 Lambda 函数提供以下权限。
- 在 AWS Lambda 函数的 Web 控制台中,导航到
配置
→权限
,然后单击执行角色
部分中的链接。这将带您进入相应 IAM 角色的 Web 控制台。 -
在
添加权限
下拉按钮中选择创建内联策略
,然后选择JSON
选项卡来定义以下基于 JSON 的策略 - 查看并保存策略。
-
使用以下内容创建一个策略文件(
smElasticApmPolicy.json
) -
使用以下命令检索 Lambda 函数的执行角色名称
aws lambda get-function-configuration --function-name THE_NAME_OF_YOUR_FUNCTION | grep "Role"
-
将新策略附加到执行角色
aws iam put-role-policy \ --role-name NAME_OR_ARN_OF_THE_EXECUTION_ROLE \ --policy-name SecretsManagerAPMKeyPolicy \ --policy-document file://smElasticApmPolicy.json
在您的 SAM template.yml
文件中添加以下策略,以授予 Lambda 函数访问存储的密钥的权限
... AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Resources: yourLambdaFunction: Type: 'AWS::Serverless::Function' Properties: ... Policies: - Statement: - Sid: SecretsManagerGetSecretValue Effect: Allow Action: - secretsmanager:GetSecretValue Resource: 'THE_ARN_OF_YOUR_SECRET' - Sid: KMSDecrypt Effect: Allow Action: - kms:Decrypt Resource: 'THE_ARN_OF_YOUR_CUSTOM_KMS_KEY' ...
在您的无服务器文件中添加以下策略,以授予 Lambda 函数访问存储的密钥的权限
将以下策略和策略附加资源添加到您的 terraform 文件中,以授予 Lambda 函数访问存储的密钥的权限
... resource "aws_iam_role" "lambda_role" { // Here is your Lambda execution role ... } resource "aws_iam_policy" "secrets_manager_elastic_apm_policy" { name = "secrets_manager_elastic_apm_policy" description = "Allows the lambda function to access the APM authentication key stored in AWS Secrets Manager." policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Action": [ "secretsmanager:GetSecretValue" ], "Effect": "Allow", "Resource": "THE_ARN_OF_YOUR_SECRET" }, { "Action": [ "kms:Decrypt" ], "Effect": "Allow", "Resource": "THE_ARN_OF_YOUR_CUSTOM_KMS_KEY" } ] } EOF } resource "aws_iam_policy_attachment" "secrets_manager_elastic_apm_policy_attach" { role = aws_iam_role.lambda_role.name policy_arn = aws_iam_policy.secrets_manager_elastic_apm_policy.arn } ...
步骤 3:配置 Elastic APM AWS Lambda 扩展编辑
最后,您需要配置 Elastic APM AWS Lambda 扩展以使用来自 Secrets Manager 的密钥,而不是通过 ELASTIC_APM_SECRET_TOKEN
或 ELASTIC_APM_API_KEY
提供的值。
在 步骤 1 中创建的密钥的名称作为 ELASTIC_APM_SECRETS_MANAGER_SECRET_TOKEN_ID
或 ELASTIC_APM_SECRETS_MANAGER_API_KEY_ID
配置选项的值,具体取决于您是要使用 APM 密钥令牌 还是 APM API 密钥。
特定于语言的说明描述了如何设置环境变量以配置 AWS Lambda 以使用 Elastic APM
就是这样。在您的 Lambda 函数的第一次调用(冷启动)时,您应该会看到来自 Elastic APM AWS Lambda 扩展的日志消息,指示正在使用来自 Secrets Manager 的密钥
"Using the APM secret token retrieved from Secrets Manager."