1

Я использую функцию AWS Lambda для создания ключа API с помощью Boto3.Создать ключ API в AWS API Gateway от AWS Lambda с помощью boto3

Тестирование локально следующий успешное:

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.

Это моя функция Лямбда-поручителя.

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?

+0

Какую ошибку он бросает? – ydaetskcoR

+0

Это не ошибка, ключ 'value' просто возвращается в словаре в реализации AWS Lambda, где он делает иначе. –

+1

Итак, как выглядит 'api_key_response' в этот момент? Попробуйте распечатать его – ydaetskcoR

ответ

2

Различия здесь могут быть отнесены к различным версиям AWS SDK в вашей среде Lambda в сравнении с вашей средой разработки.

В новых версиях SDK значение ключа API не указано в некоторых ответах как мера безопасности. Вы можете получить значение ключа API с помощью отдельного вызова get_api_key с includeValue = True

+0

Я попытался использовать 'get_api_key' с аргументом' includeValue = True', а 'includeValue' не прошел проверку параметров. См. OP. –

+0

Я должен отметить, что я использую boto3 v1.3.1 в моей среде dev, которая совпадает с реализацией AWS. –

+0

Я бы предложил связать последнюю версию SDK (1.4) в вашей функции Lambda. Lambda имеет тенденцию отставать в выпусках SDK. См. Http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html. –

Смежные вопросы