1

我有一個lambda函數將一些數據寫入到我也通過AWS設置的Elasticsearch域中。目前在我的域名訪問策略是隻允許我自己的IP地址與域名通過http正確簽署對aws資源的請求

{"Version": "2012-10-17", "Statement": [{ 
"Effect": "Allow", "Principal": {"AWS": "*"}, 
"Action": "es:*", 
"Resource": "arn:aws:es:us-east-1:$ACCOUNT:domain/DOMAIN/*", 
"Condition": { "IpAddress": { "aws:SourceIp": $MYIP } } 
}]} 

我發現aws4 library簽署http請求的工作。我用它作爲這樣的:

axios(aws4.sign({ 
    host: process.env.ES_ENDPOINT, 
    method: "post", 
    url: `https://${process.env.ES_ENDPOINT}/foobot/foobot`, 
    data, 
})) 

這是實際工作之前沒有aws4.sign片,因爲我有ES領域完全開放的,但現在我已經應用於上述IP地址的策略。現在

,我不斷獲得類似這樣的錯誤響應:

我們出的要求籤名您提供的簽名不匹配。檢查您的AWS祕密訪問密鑰和簽名方法。詳細信息請參閱服務文檔。

我還需要做些什麼來正確簽署請求?

回答

2

這實際上與兩個庫axiosaws4有關。 aws4將基於正常的NodeJS http請求進行簽名,並且在具有主體的POST請求中,正文需要來正確簽署該請求。

這是通過也傳遞bodypath

axios(aws4.sign({ 
    host: process.env.ES_ENDPOINT, 
    method: "POST", 
    url: `https://${process.env.ES_ENDPOINT}/foobot/foobot`, 
    data, 
    body: JSON.stringify(data), 
    path: "/foobot/foobot", 
})) 
很簡單地固定