![](/img/trans.png)
[英]How to send JSON array through graphQL and AWS AppSync to add data to Dynamo Table?
[英]How to send signed HTTP request from AWS Lambda to AppSync GraphQL?
我不確定如何將簽名的 http 請求發送到 AppSync GraphQL 端點。 AWS 中沒有用於執行此操作的庫。
aws-amplify
不起作用,因為僅適用於瀏覽器,而不適用於 Lambda 函數。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
}
});
//(...)
第二個示例需要進行一些調整以滿足您的要求,我必須更改的內容是:
signer
聲明 - 我必須更改服務(用execute-api
替換es
)signer.addAuthorization
我不得不使用AWS.config.credentials
(已經由第一個示例中的代碼初始化)而不是AWS.EnvironmentCredentials('AWS')
希望這可以幫助某人!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.