Anteriormente, cuando no configuré MFA para iniciar sesión en la consola de AWS, me conecté a dynamodb mediante
dynamo = boto3.resource('dynamodb', region_name='ap-northeast-2', endpoint_url='http://dynamodb.ap-northeast-2.amazonaws.com') table = dynamo.Table('tablename')y preguntar a esa mesa estaba perfectamente bien.
response = table.query( KeyConditionExpression =Key("user_id").eq(123123) )Después de configurar MFA para seguridad adicional para iniciar sesión en la consola de AWS y ahora, cuando ejecuto el código anterior, obtengo:
ClientError: An error occurred (UnrecognizedClientException) when calling the Query operation: The security token included in the request is invalid.Yo uso el túnel para RDB, ¿hay algo así que pueda usar para conectarme a dynamodb o hay algún permiso que necesito para acceder a dynamodb?
Cuando habilita MFA, SDK no sabe automáticamente cómo trabajar con él. Las claves SECRET y API de su usuario habitual de IAM ya no son suficientes. En su lugar, debe usar credenciales temporales creadas solo para su sesión de MFA.
Para hacer que MFA funcione con boto3, debe llamar explícitamente a get_session_token :
Los usuarios de IAM habilitados para MFA tendrían que llamar a GetSessionToken y enviar un código MFA asociado con su dispositivo MFA. Utilizando las credenciales de seguridad temporales que se devuelven de la llamada, los usuarios de IAM pueden realizar llamadas programáticas a las operaciones de API que requieren autenticación MFA.
Usando get_session_token puede llamar al servicio sts que le proporcionará credenciales temporales basadas en sus detalles de MFA:
sts = boto3.client('sts') mfa_response = sts.get_session_token( DurationSeconds=123, SerialNumber='string', TokenCode='string' ) La llamada devolverá las credenciales en mfa_response que puede usar para crear una nueva sesión de boto3 . Por ejemplo:
mfa_session = boto3.session.Session( aws_access_key_id=mfa_session['Credentials']['AccessKeyId'], aws_secret_access_key=mfa_session['Credentials']['SecretAccessKey'], aws_session_token=mfa_session['Credentials']['SessionToken']) dynamo = mfa_session.resource('dynamodb', ...) # and the rest of the code