2017-06-24 59 views
5

Podczas próby uruchomienia i zatrzymania RDS instancji z boto3 na AWS Lambda, jestem coraz ciekawy błąd - 'RDS' object has no attribute 'stop_db_instance': AttributeErrorboto3 start/stop wystąpienie RDS z AWS Lambda

Nawet najprostszy kod generuje ten błąd, na przykład

import boto3 

def lambda_handler(event, context):  
    boto3.client('rds').stop_db_instance(DBInstanceIdentifier='myInstanceID') 

Używam python3.6 czas pracy, tak jak na informacjach dostępnych na this stronie boto3 1.4.4 powinny być dostępne (co już zakładać ma odpowiednie metody - https://boto3.readthedocs.io/en/latest/reference/services/rds.html#RDS.Client.stop_db_instance)

Wszelkie sugestie są docenia !

Odpowiedz

7

Użyłem boto3==1.4.1 i botocore==1.4.64 i otrzymałem ten sam błąd co Twój zarówno lokalnie jak i na lambda.

AWS Lambda musi używać starej biblioteki botocore. Próbowałem używać boto3==1.4.4 i botocore==1.5.75 i zadziałało.

Dlatego zdecydowałem się przesłać mój własny plik zip zawierający najnowsze boto3 i botocore (wspomniane powyżej) i to działa.

Creating a Deployment Package

UPDATE

Tu jest mój kod AWS lambda fragment -

import botocore 
import boto3 

def lambda_handler(event, context): 
    print("Version is {}".format(botocore.__version__)) 
    boto3.client('rds').stop_db_instance(DBInstanceIdentifier='myInstanceID') 

output: wersja jest 1.5.52

i 1.05.52 jest odpowiedzialny za nie posiadający atrybut stop_db_instance w module rds. Tak więc ręczne tworzenie zip o najnowszej wersji zrobi lewy.

Dzięki

+0

działa jak czar, tak jak napisałeś - botocore wersja był problem !. Dziękuję Ci! –

-1

Czy próbowałeś deklarując RDS wyraźnie:

import boto3 

rds = boto3.client('rds') 
rds.stop_db_instance(DBInstanceIdentifier='myInstanceID') 

Czy nadal uzyskać "obiekt RDS nie ma atrybutu 'stop_db_instance': AttributeError" błąd.

0

Myślę, że brakuje Ci najpierw utworzenia sesji w boto3. Więc idealnie Twój kod powinien wyglądać

Zakładając masz aws_profile profil, ustaw albo można utworzyć sesję z boto3 dokumentacji tutaj: http://boto3.readthedocs.io/en/latest/reference/core/session.html

session = boto3.Session(profile_name=aws_profile) 
rds_client = session.client('rds') 
rds_client.stop_db_instance(DBInstanceIdentifier='myInstanceID') 
+0

Ten kod działa w AWS Lamba, więc sesja nie jest wymagana z tego, co mogę powiedzieć. –

0

Dzięki za tego rozwiązania!

Używam lambci/docker-lambda z Dockerem, aby przetestować moje funkcje lambda, i tak jak w prawdziwej lambdzie, botocore jest obecnie nieaktualne. Aby dodać botocore do projektu lambda:

pip install botocore -t /your/project/dir

W przypadku, gdy pracujesz na Mac OSX i instalowane przy użyciu pip napar The -t nie będzie działać. Wykonaj następujące polecenie, w którym znajduje się plik lambda_function.py, i dobrze jest przejść.

docker run -v "$PWD":/localdir python:2.7-alpine pip install botocore -t /localdir