2017-04-11 2 views
0

J'essaye de me connecter à Athena en utilisant pyathenajdbc.connect(). J'ai la configuration des informations d'identification AWS via l'authentification multifacteur. Lorsque je n'inclue pas le jeton AWS dans la chaîne de connexion, j'obtiens l'erreur suivante.Echec de l'interrogation d'AWS Athena à partir de Python 2.7, lors du passage du jeton de session AWS dans pyathenajdbc.connect()

athena_conn = connect(access_key=AWS_KEY_ID, secret_key=AWS_SECRET, s3_staging_dir='s3://abc-pqr-xyz/processed/athena-outputs/',region_name=REGION)

EROR: pyathenajdbc.error.DatabaseError: The security token included in the request is invalid. (Service: AmazonAthena; Status Code: 400; Error Code: UnrecognizedClientException; Request ID: 0d488c0b-1eed-11e7-bad8-711e54af6b73)

Quand je l'AWS inclus jeton dans la chaîne de connexion je rencontrer l'erreur suivante ->

athena_conn = connect(access_key=AWS_KEY_ID, secret_key=AWS_SECRET, token=AWS_SESSION_TOKEN, s3_staging_dir='s3://abc-pqr-xyz/processed/athena-outputs/',region_name=REGION) ERROR: pyathenajdbc.error.DatabaseError: The security token included in the request is invalid. (Service: AmazonAthena; Status Code: 400; Error Code: UnrecognizedClientException; Request ID: 91751051-1eed-11e7-8347-153dfe3d84a6)

Est-ce que quelqu'un sait ce qui ne va pas ici ??

Voici l'intégralité de mon code.

from pyathenajdbc import connect 
from pyathenajdbc.util import as_pandas 
from boto3 import Session 
import jpype 
jvm_path = jpype.getDefaultJVMPath() 

_current_credentials = Session().get_credentials() 
AWS_KEY_ID = _current_credentials.access_key 
AWS_SECRET = _current_credentials.secret_key 
AWS_SESSION_TOKEN = _current_credentials.token 
REGION = "us-east-2" 

#athena_conn = connect(access_key=AWS_KEY_ID, secret_key=AWS_SECRET, s3_staging_dir='s3://abc-pqr-xyz/processed/athena-outputs/',region_name=REGION) 

athena_conn = connect(access_key=AWS_KEY_ID, secret_key=AWS_SECRET, token=AWS_SESSION_TOKEN, s3_staging_dir='s3://abc-pqr-xyz/processed/athena-outputs/',region_name=REGION) 

cursor = athena_conn.cursor(); 
query = 'SELECT * FROM xyz.ABC limit 1;' 
cursor.execute(query) 
df = as_pandas(cursor) 
print(df) 

Répondre

0
from pyathenajdbc import connect 
from pyathenajdbc.util import as_pandas 
from boto3 import Session 
import os 

_current_credentials = Session().get_credentials() 

os.environ['AWS_ACCESS_KEY_ID'] = _current_credentials.access_key 
os.environ['AWS_SECRET_ACCESS_KEY'] = _current_credentials.secret_key 
os.environ['AWS_SESSION_TOKEN'] = _current_credentials.token 


athena_conn = connect(s3_staging_dir='s3://your-bucket/', 
      region_name='us-west-2', 
      aws_credentials_provider_class='com.amazonaws.athena.jdbc.shaded.com.amazonaws.auth.EnvironmentVariableCredentialsProvider') 

cursor = athena_conn.cursor(); 
query = 'SELECT * FROM schema.table_name limit 1;' 
cursor.execute(query) 
df = as_pandas(cursor) 
print(df) 
0

Le problème n'est pas simple mais je suppose qu'il a quelque chose à voir avec vos informations d'identification. Vous devriez étudier un peu: essayez d'imprimer vos clés et vérifiez si elles sont valides ou non.

Voici une alternative que j'utilise pour saisir mes lettres de créance:

import configparser  

aws_config_file = '~/.aws/config' 

Config = configparser.ConfigParser() 
Config.read(os.path.expanduser(aws_config_file)) 

access_key_id = Config['default']['aws_access_key_id'] 
secret_key_id = Config['default']['aws_secret_access_key'] 

Sinon, pour vous assurer que la question ne soit pas lié au pilote jdbc, coller la sortie de la commande suivante

import pyathenajdbc 

print(pyathenajdbc.ATHENA_CONNECTION_STRING) 
print(pyathenajdbc.ATHENA_DRIVER_CLASS_NAME) 
print(pyathenajdbc.ATHENA_DRIVER_DOWNLOAD_URL) 
print(pyathenajdbc.ATHENA_JAR) 
+0

Salut, Merci pour votre réponse. Voici la sortie -'jdbc: awsathena: // athena. {Région} .amazonaws.com: 443/hive/{schéma}/ com.amazonaws.athena.jdbc.AthenaDriver https://s3.amazonaws.com /athena-downloads/drivers/AthenaJDBC41-1.0.0.jar AthenaJDBC41-1.0.0.jar' – Guddi

+0

Aussi, confirmé que les clés sont valides – Guddi

+0

je vois. Je pense que cela a quelque chose à voir avec vos permissions sur AWS Athena. S'il vous plaît vérifiez si vous pouvez accéder à la console Athena en utilisant les mêmes informations d'identification –

1

en supposant que vous avez un fichier de configuration sous le dossier ~/.AWS qui a la région définie, vous pouvez utiliser session(). REGION_NAME

Les travaux suivants très bien (n'a pas eu à importer OS):

from pyathenajdbc import connect 
from pyathenajdbc.util import as_pandas 
from boto3 import Session 
import jpype 
jvm_path = jpype.getDefaultJVMPath() 

_current_credentials = Session().get_credentials() 
AWS_KEY_ID = _current_credentials.access_key 
AWS_SECRET = _current_credentials.secret_key 
REGION = Session().region_name 

athena_conn = connect(access_key=AWS_KEY_ID, 
       secret_key=AWS_SECRET, 
       s3_staging_dir='path_to_staging_dir', 
       region_name=REGION) 

cursor = athena_conn.cursor(); 

query = 'SELECT current_date;' 

cursor.execute(query) 
df = as_pandas(cursor) 
print(df)