如何从AWS Lambda调用AWS_IAM授权的API网关端点,其执行角色是否有权这样做?

时间:2016-12-20 21:58:32

标签: amazon-web-services aws-lambda aws-api-gateway signing

我想调用一个AWS API Gateway端点,该端点的执行AWS Lambda的授权设置为AWS_IAM,执行角色有权执行该API网关。

enter image description here

我是否仍然使用Lambda的当前执行角色签署API网关的HTTPS请求?

编辑:

查看http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html,我可以使用SDK调用AssumeRole来承担有权执行Api Gateway的角色,然后提取可用于签署请求的密钥。

2 个答案:

答案 0 :(得分:3)

可以从环境变量中检索lambda执行角色的凭据 - AWS_SESSION_TOKEN,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY。

您可以使用上述凭据对请求进行签名。签名文档在http://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html。您还可以查看执行此操作的第三方库。

请注意,由于您有会话令牌,因此您需要按照此处所述http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html#RequestWithSTS

进行处理

答案 1 :(得分:1)

@Abhigna Nagaraja pointed out一样,您可以使用environment variables检索执行lambda的凭据。

如果您使用的是Python,则可以使用aws_requests_auth库对请求进行签名。您也可以查看文档中的complete example on how to sign the request

以下是有关如何签署来自lambda的请求的摘要:

import json
import requests
import os
from aws_requests_auth.aws_auth import AWSRequestsAuth


def lambda_handler(event, context):
    api_id = 'XXXXXXXXX'  # Replace with your API Gateway Id
    api_url = 'https://{}.execute-api.eu-west-1.amazonaws.com/dev/hello'.format(api_id)

    aws_access_key_id = os.environ['AWS_ACCESS_KEY_ID']
    aws_secret_access_key = os.environ['AWS_SECRET_ACCESS_KEY']
    aws_session_token = os.environ['AWS_SESSION_TOKEN']

    auth = AWSRequestsAuth(aws_access_key=aws_access_key_id,
                           aws_secret_access_key=aws_secret_access_key,
                           aws_token=aws_session_token,
                           aws_host='{}.execute-api.eu-west-1.amazonaws.com'.format(api_id),
                           aws_region='eu-west-1',
                           aws_service='execute-api')

    response = requests.get(api_url, auth=auth)
    return {
        'statusCode': 200,
        'body': json.dumps(response.json())
    }

希望有帮助。