使用 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 Serverless Application Model (SAM) 不提供在 AWS Secrets Manager 中创建密钥的方法。请使用其他选项之一创建密钥。
Serverless Framework 不提供在 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' ...
在您的 serverless 文件中,添加以下策略,以便让 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."