2017-11-29 19 views
1

AWS Lambdaで作業しています。私はathenaで簡単なクエリを作成し、s3にデータを保存したいと考えています。Lambda PythonリクエストathenaエラーOutputLocation

マイコード:

import boto3 

def lambda_handler(event, context): 
    query_1 = "SELECT * FROM test_athena_laurent.stage limit 5;" 
    database = "test_athena_laurent" 
    s3_output = "s3://athena-laurent-result/lambda/" 

    client = boto3.client('athena') 

    response = client.start_query_execution(
    QueryString=query_1, 
    ClientRequestToken='string', 
    QueryExecutionContext={ 
     'Database': database 
    }, 
    ResultConfiguration={ 
     'OutputLocation': 's3://athena-laurent-result/lambda/' 
    } 
    ) 
    return response 

それは、スパイダー2.7上で動作しますが、AWSで、私はこのエラーを持っている:

Parameter validation failed: 
Invalid length for parameter ClientRequestToken, value: 6, valid range: 32-inf: ParamValidationError 
Traceback (most recent call last): 
    File "/var/task/lambda_function.py", line 18, in lambda_handler 
    'OutputLocation': 's3://athena-laurent-result/lambda/' 

私はそれは私の道を理解していないことを考えると、私は知りませんなぜ。提供されていない場合

おかげ

+0

*「パラメータの検証が失敗しました - 無効な長さをパラメータClientRequestTokenため」*で、かなり明確な、限りエラーメッセージが懸念しているよう。たぶん ''string''はこのパラメータの正しい値ではないでしょう。 – Tomalak

+0

ありがとう、それは私のエラーです。 ClientRequestTokenはどこにありますか? –

+0

spyderのようにClientRequestTokenを削除します。スパイダーでは動作しますが、AWSでは動作しません。私はその権利を持っていないかもしれません。 'ClientError:StartQueryExecution'を呼び出すときにエラーが発生しました(AccessDeniedException) –

答えて

0

@トマラックのポイントClientRequestTokenは、stringです。しかし、私がリンクしたばかりのドキュメンテーションごとに、SDKを使用する場合は必要ありません。

This token is listed as not required because AWS SDKs (for example the AWS SDK for Java) auto-generate the token for users. If you are not using the AWS SDK or the AWS CLI, you must provide this token or the action will fail.

だから、私は次のようなリファクタリングになります。

import boto3 


def lambda_handler(event, context): 
    query_1 = "SELECT * FROM some_database.some_table limit 5;" 
    database = "some_database" 
    s3_output = "s3://some_bucket/some_tag/" 

    client = boto3.client('athena') 

    response = client.start_query_execution(QueryString = query_1, 
             QueryExecutionContext={ 
              'Database': database 
             }, 
             ResultConfiguration={ 
              'OutputLocation': s3_output 
             } 
             ) 
    return response 
1

ClientRequestToken (string) -- A unique case-sensitive string used to ensure the request to create the query is idempotent (executes only once). If another StartQueryExecution request is received, the same response is returned and another query is not created. If a parameter has changed, for example, the QueryString , an error is returned. [ Boto3 Docs ]

このフィールドはautopopulatedされます。

ClientRequestTokenの文字列値を指定する場合は、within length limits from 32 to 128であることを確認してください。