簡體   English   中英

如何將已簽名的 HTTP 請求從 AWS Lambda 發送到 AppSync GraphQL?

[英]How to send signed HTTP request from AWS Lambda to AppSync GraphQL?

我不確定如何將簽名的 http 請求發送到 AppSync GraphQL 端點。 AWS 中沒有用於執行此操作的庫。

  • aws-amplify不起作用,因為僅適用於瀏覽器,而不適用於 Lambda 函數。
  • AppSync 的aws-sdk僅供管理員使用,它沒有調用用戶端 api 的方法

是否可以從 AWS Lambda 發出 IAM 簽名的 HTTP 請求? (以某種簡單的方式)

我建議閱讀這篇文章: 后端 GraphQL:如何從 AWS Lambda 觸發 AWS AppSync 突變

引用作者https://stackoverflow.com/users/1313441/adrian-hall ,我們已經:

GraphQL 通過 HTTPS 路由。 這意味着我們可以使用簡單的 HTTPS POST 模擬 GraphQL 客戶端庫。 由於我們使用的是 IAM,因此我們需要在提交請求之前對其進行簽名。 這是我的代碼:

// ... more code here
    // POST the GraphQL mutation to AWS AppSync using a signed connection
    const uri = URL.parse(env.GRAPHQL_API);
    const httpRequest = new AWS.HttpRequest(uri.href, env.REGION);
    httpRequest.headers.host = uri.host;
    httpRequest.headers['Content-Type'] = 'application/json';
    httpRequest.method = 'POST';
    httpRequest.body = JSON.stringify(post_body);

    AWS.config.credentials.get(err => {
        const signer = new AWS.Signers.V4(httpRequest, "appsync", true);
        signer.addAuthorization(AWS.config.credentials, AWS.util.date.getDate());

        const options = {
            method: httpRequest.method,
            body: httpRequest.body,
            headers: httpRequest.headers
        };

        fetch(uri.href, options)
// ... more code here

我一直將它用作我所有 Lambda->AppSync 通信的模板!

您可以使用任何 graphql 客戶端或 sigv4 簽名的 HTTP 請求。 以下是為請求創建簽名的方法 ( https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html )。 如果您將執行角色附加到您的 lambda,您可以從 lambda 環境變量( https://docs.aws.amazon.com/lambda/latest/dg/lambda-environment-variables.html )訪問它的訪問密鑰。

這個問題已經得到了回答,但是因為它首先出現在我身上,所以我想我會分享另一個解決方案。

我的用例是向 AWS 上托管的自定義 HTTP API 發送一個簽名請求,其中 cognito 用作身份驗證后端,僅啟用了 ALLOW_USER_SRP_AUTH(因此沒有 ALLOW_ADMIN_USER_PASSWORD_AUTH 也沒有 ALLOW_USER_PASSWORD_AUTH)

我最終結合了來自 AWS 的這個示例,展示了如何在節點中進行認知身份驗證:

AWS 的另一個示例顯示了如何簽署請求:

您可以通過替換此行(來自第一個示例)將第二個示例插入到第一個示例中:

//(...)
        //refreshes credentials using AWS.CognitoIdentity.getCredentialsForIdentity()
        AWS.config.credentials.refresh(error => {
            if (error) {
                console.error(error);
            } else {
                // Instantiate aws sdk service objects now that the credentials have been updated.
                // example: var s3 = new AWS.S3();
                console.log('Successfully logged!'); // <-- replace this line
            }
        });
//(...)

第二個示例需要進行一些調整以滿足您的要求,我必須更改的內容是:

  • HTTP 方法(我需要 GET)
  • signer聲明 - 我必須更改服務(用execute-api替換es
  • signer.addAuthorization我不得不使用AWS.config.credentials (已經由第一個示例中的代碼初始化)而不是AWS.EnvironmentCredentials('AWS')

希望這可以幫助某人!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM