我已经处理这个问题有一段时间了。我想调用经过 AWS_IAM 身份验证的 Lambda 函数 URL,发送访问令牌(由 Cognito 用户池生成)作为授权标头。
我知道我可以将访问令牌作为 API Gateway HTTP 或 REST API 的请求标头发送,但我不确定它是否也适用于 Lambda 函数。
我找不到有关我的问题的任何文档,只是有关调用 Lambda 函数 URL 的 Signature V4 身份验证方法的其他文档:https://docs.aws.amazon.com/lambda/latest/dg/urls-invocable.html
Lambda 函数 URL 的安全和身份验证模型 有两个 AuthType 选项:
基于 Cognito JWT 的访问令牌不是 AWS IAM 会话令牌,因此无法使用 SigV4 对请求进行签名。对于每个 Lambda 函数 URL AuthType 选项,您都有不同的选项。
如果身份验证类型是 AWS_IAM 并且您使用 python 的
requests
模块发出请求,那么这应该适合您。我正在使用 aws-requests-auth 签署请求。
有关凭据的注意事项:您需要提供一个
aws_access_key
、一个 aws_secret_access_key
和一个 aws_token
。在你的情况(和我的情况)中,这些信息需要以某种方式传递到 lambda 函数中。首选方法是使用 Secrets
,但根据您的情况,这可能可行也可能不可行。在下面的示例中,我只是使用 boto3.Session().get_credentials()
从环境中检索凭据,在 lambda
的情况下,将检索函数执行角色的凭据。
import requests
import urllib.parse
from aws_requests_auth.aws_auth import AWSRequestsAuth
credentials = boto3.Session().get_credentials()
FUNC_URL = https://y103j5j68sga7xuqzru42xjlexxi0vrieb.lambda-url.ap-northeast-1.on.aws/
auth = AWSRequestsAuth(
aws_access_key=credentials.access_key,
aws_secret_access_key=credentials.secret_key,
aws_token=credentials.token,
aws_host=urllib.parse.urlparse(FUNC_URL).netloc,
aws_region=credentials.region,
aws_service="lambda",
)
requests.post(
url=FUNC_URL,
auth=auth,
data=json.dumps({"YOUR": "DATA"}),
headers={"Content-Type": "application/json"}
,
)