web-dev-qa-db-ja.com

PythonからGraphQLクエリをAppSyncに送信する方法

Botoを使用してAWS AppSyncでGraphQLリクエストを送信するにはどうすればよいですか?

結局のところ、AWSでスタックレス/クラウドフォーミングスタックにアクセスするモバイルアプリをpythonで模倣しようとしています。 JavaScriptや増幅ではありません。

主な問題は認証です。私はすでに数十の異なる方法を試しました。これは、「UnauthorizedException」と「Permission denied」を含む「401」応答を生成する現在のものです。これは、私がこれまでに受け取った他のメッセージのいくつかを考慮すると、かなり良いものです。現在、「aws_requests_auth」ライブラリを使用して署名部分を行っています。私はローカル環境から保存された/.aws/credentialsを使用して私を認証すると思いますか、それともそうですか?

認識アイデンティティとプールがどこにどのようにして組み込まれるかについて、少し混乱しています。例:サインアップシーケンスを模倣したいと思いますか?

とにかく、コードはかなり簡単に見えます。私は認証を壊しません。

from aws_requests_auth.boto_utils import BotoAWSRequestsAuth

APPSYNC_API_KEY = 'inAppsyncSettings'
APPSYNC_API_ENDPOINT_URL = 'https://aaaaaaaaaaaavzbke.appsync-api.ap-southeast-2.amazonaws.com/graphql'

headers = {
    'Content-Type': "application/graphql",
    'x-api-key': APPSYNC_API_KEY,
    'cache-control': "no-cache",
}
query = """{
    GetUserSettingsByEmail(email: "john@washere"){
      items {name, identity_id, invite_code}
    }
}"""


def test_stuff():
    # Use the library to generate auth headers.
    auth = BotoAWSRequestsAuth(
        aws_Host='aaaaaaaaaaaavzbke.appsync-api.ap-southeast-2.amazonaws.com',
        aws_region='ap-southeast-2',
        aws_service='appsync')

    # Create an http graphql request.
    response = requests.post(
        APPSYNC_API_ENDPOINT_URL, 
        json={'query': query}, 
        auth=auth, 
        headers=headers)

    print(response)

# this didn't work:
#    response = requests.post(APPSYNC_API_ENDPOINT_URL, data=json.dumps({'query': query}), auth=auth, headers=headers)

収量

{
  "errors" : [ {
    "errorType" : "UnauthorizedException",
    "message" : "Permission denied"
  } ]
}
3
John Mee

担当者が少ないためコメントを追加できませんが、承認された回答を試してもうまくいかなかったことを追加したいだけです。 session_tokenが無効であるというエラーが発生しました。おそらくAWS Lambdaを使っていたからでしょう。

私はそれをかなり正確に機能させましたが、aws4authオブジェクトのセッショントークンパラメータに追加することによって。ここに完全な部分があります:

import requests
import os
from requests_aws4auth import AWS4Auth

def AppsyncHandler(event, context):

    # These are env vars that are always present in an AWS Lambda function
    # If not using AWS Lambda, you'll need to add them manually to your env.

    access_id = os.environ.get("AWS_ACCESS_KEY_ID")
    secret_key = os.environ.get("AWS_SECRET_ACCESS_KEY")
    session_token = os.environ.get("AWS_SESSION_TOKEN")
    region = os.environ.get("AWS_REGION")

    # Your AppSync Endpoint
    api_endpoint = os.environ.get("AppsyncConnectionString")
    
    resource = "appsync"
    

    session = requests.Session()
    session.auth = AWS4Auth(access_id, 
                            secret_key, 
                            region, 
                            resource, 
                            session_token=session_token)

残りは同じです。

0
Dhruv