0

私はawsラムダにgoogle's people apiを使用しようとしています。 APIはのOAuth2必要とするので、私はトークンローカルでのOAuth2をフェッチして、AWSのラムダに転送しようとした:awsラムダでGoogleの人々apiに

私はこの機能を備えた秘密を格納します。

from oauth2client.file import Storage 
from oauth2client import client, tools 

def get_credentials(): 
    credential_path = os.path.join(SCRIPT_DIR, 'people-api-secret.json') 
    store = Storage(credential_path) 
    credentials = store.get() 
    if not credentials or credentials.invalid: 
     flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) 
     flow.user_agent = APPLICATION_NAME 
     credentials = tools.run_flow(flow, store) 
     print('Storing credentials to ' + credential_path) 
    return credentials 

その後、私はサーバーレスを使用して、AWSのラムダにpeople-api-secret.jsonを転送しますフレームワーク。しかし、ラムダで秘密を読み込もうとすると、store.get()Noneを返します。ファイルは実際にAWSにあります(os.path.isfile(credential_path)Trueを返します)。

これらの秘密を別のコンピュータ/ IPアドレスにコピーすることはできませんか?そうでない場合は、例えば、以下のような「本格的なやり方」をせずにこれを動作させる「最小限の方法」は何でしょうか? print(open(credential_path).read())利回り[Errno 13] Permission denied: '/var/task/people-api-secret.json':それはシンプルだということが分かったhere

更新ラムダのエラーを「許可が拒否されました」。私はそれらの変数をファイルから読み込むのではなく、環境に入れるべきだと思いますか?

+1

ラムダ機能を展開する前に、jsonファイルに適切な権限(chmod)を与えてください。このファイルを実行時にダウンロードする場合は、/ tmpディレクトリ: '/tmp/people-api-secret.json'に資格情報を保存してください。これは、ラムダコンテナにファイルを書き込むことができる唯一のディレクトリです。 –

答えて

0

正しいアクセス許可を与えるのはおそらく(Tom Melosのコメントとthis github issueによると)うまくいくが、これはベストプラクティスとして記述されているため、シークレットを環境変数に入れたいと思った。

まず、(あなたがthis guide次のGoogle APIコンソールからダウンロードできるファイルclient_secret.jsonを必要としている)私は、トークンを取得する方法を必要とするので、私はこれを実行しました:

from oauth2client import client, tools 

class MyStorage(client.Storage): 
    def locked_put(self, credentials): 
    print("="*70) 
    print("client_id: {}\nclient_secret: {}\nrefresh_token: {}".format(
     credentials.client_id, credentials.client_secret, credentials.refresh_token)) 
    print("="*70) 

flow = client.flow_from_clientsecrets('client_secret.json', 'https://www.googleapis.com/auth/contacts.readonly') 
flow.user_agent = 'my-user-agent' 
storage = MyStorage() 
tools.run_flow(flow, storage) 

私が入れた3つの文字列をthis guide以下の環境にして、これを行うことができました。詳細については

import os 
from oauth2client import client 
from apiclient import discovery 

client_id = os.environ['GOOGLE_PEOPLE_CLIENT_ID'] 
client_secret = os.environ['GOOGLE_PEOPLE_CLIENT_SECRET'] 
refresh_token = os.environ['GOOGLE_PEOPLE_REFRESH_TOKEN'] 
credentials = client.GoogleCredentials(None, 
    client_id, 
    client_secret, 
    refresh_token, 
    None, 
    "https://accounts.google.com/o/oauth2/token", 
    'my-user-agent') 
http = credentials.authorize(httplib2.Http()) 
service = discovery.build('people', 'v1', http=http, 
    discoveryServiceUrl='https://people.googleapis.com/$discovery/rest', 
    cache_discovery=False) 

を(個人的に私はちょうどのOAuth2の基礎を学んだ)私はこれらのrequeに何が起こるかdocumented hereをしましたなぜここにrefresh_tokenが必要なのでしょうか?値として、環境変数のキーと資格情報JSONファイル名としてあなたのラムダ・コンフィギュレーション・セットGOOGLE_APPLICATION_CREDENTIALSで

#import GoogleCredentials 
from oauth2client.client import GoogleCredentials 

credentials = GoogleCredentials.get_application_default() 
service = discovery.build('people', 'v1', credentials=credentials,cache_discovery=False) 

2

はこれを行う、その後、あなたがやっているだけのように、秘密鍵を使用してJSONをアップロードします。

GoogleのAPIを使用しているすべてのラムダで動作します。

関連する問題