使用boto3 {AWS}从AWS Lambda在AWS API Gateway中创建API密钥

时间:2016-09-14 10:44:00

标签: python amazon-web-services aws-lambda aws-api-gateway boto3

我正在使用AWS Lambda函数使用Boto3创建API密钥。

使用以下方法在本地进行测试是成功的:

import boto3

client = boto3.client('apigateway')

response = client.create_api_key(
    name='test_user_from_boto',
    description='This is the description',
    enabled=True,
    generateDistinctId=True,
    value='',
    stageKeys=[{
        'restApiId':'aaa',
        'stageName':'beta'
    }]
)

将字典作为expected返回没有问题。返回字典包含一个value键,它具有生成的api键值,这就是我所追求的。

在AWS Lambda中执行类似操作时,返回字典不包含value键。

这是我的Lambda hander函数。

import boto3


api_id = 'zzz'
plan_id_map = {
    'trial': 'aaa', 
    'basic': 'bbb', 
    'professional': 'ccc'
}

def handler(event, context):
    user_name = event['user_name']
    stage = event['stage']
    plan = event['plan']

    client = boto3.client('apigateway')
    api_key_response = client.create_api_key(
        name=user_name, 
        description='', 
        enabled=True, 
        # generateDistinctId=True, # including this argument throws an error
        # value='', # including this argument throws an error
        stageKeys=[{
            'restApiId': api_id, 
            'stageName': stage
        }]
    )

    user_key_id = api_key_response['id']
    user_api_key = api_key_response['value'] # throws a key error here

    plan_response = client.create_usage_plan_key(
        usagePlanId=plan_id_map[plan],
        keyId=user_key_id,
        keyType='API_KEY')    

    return {
        'user_name': user_name,
        'user_key_id': user_key_id,
        'user_api_key': user_api_key
    }

打印api_key_response的结果如下:

{
    u'name': u'test_user_from_lambda', 
    'ResponseMetadata': {
        'HTTPStatusCode': 201, 
        'RequestId': 'b8298d38-7aec-11e6-8322-5bc341fc4b73', 
        'HTTPHeaders': {
            'x-amzn-requestid': 'b8298d38-7aec-11e6-8322-5bc341fc4b73',
            'date': 'Thu, 15 Sep 2016 02:33:00 GMT', 
            'content-length': '203', 
            'content-type': 'application/json'
        }
    },
    u'createdDate': datetime.datetime(2016, 9, 15, 2, 33, tzinfo=tzlocal()), 
    u'lastUpdatedDate': datetime.datetime(2016, 9, 15, 2, 33, tzinfo=tzlocal()), 
    u'enabled': True, 
    u'id': u'xyzxyz', 
    u'stageKeys': [u'abcabc/beta']
}

尝试使用get_api_key时,我收到参数验证错误:

get_api_key_response = client.get_api_key(
    apiKey='585yw0f1tk',
    includeValue=True
)

Unknown parameter in input: "includeValue", must be one of: apiKey: ParamValidationError

是否修改了AWS boto3模块以排除value密钥?如何返回生成的api密钥?

1 个答案:

答案 0 :(得分:2)

此处的差异可归因于Lambda环境中AWS SDK与开发环境的不同版本。

在较新版本的SDK中,某些响应会省略API密钥值作为安全措施。您可以通过单独调用get_api_key并使用includeValue = True

来检索API密钥值