Я пытаюсь сделать простой HTTP-запрос, который бы опубликовал сообщение в Amazon SNS. Нет SDK, просто curl
.
Я начал с того же подхода, который использовался для доступа к Amazon S3, то есть для включения заголовка Authorization
в запрос. Вот пример рабочего кода, который загружает список файлов с S3:
date=$(date +"%a, %d %b %Y %T %z")
name=$(basename "$f")
acl="x-amz-acl:bucket-owner-full-control"
string="GET\n\n\n$date\n/$bucket/"
signature=$(echo -en "$string" | openssl sha1 -hmac "$secret_key" -binary | base
64)
prefix="daily-$(date -u +"%FT%H-")"
echo "Downloading the list..."
curl \
-H "Host: ${bucket}.s3.amazonaws.com" \
-H "Date: $date" \
-H "Authorization: AWS ${access_key}:$signature" \
--connect-timeout 1 \
"https://${bucket}.s3.amazonaws.com/?prefix=$prefix&max-keys=10000"
Пытаясь сделать то же самое для SNS, вот что я получил:
date=$(date +"%a, %d %b %Y %T %z")
string="GET\n\n\n$date\n/"
signature=$(echo -en "$string" | openssl sha1 -hmac "$secret_key" -binary | base
64)
curl \
-X POST \
-G \
-H "Host: sns.us-west-2.amazonaws.com" \
-H "Date: $date" \
-H "Authorization: AWS ${access_key}:$signature" \
"https://sns.us-west-2.amazonaws.com/" \
--data-urlencode "Action=Publish" \
--data-urlencode "TargetArn=$arn" \
--data-urlencode "Message=Hello, World!" \
--data-urlencode "Version=2010-03-31"
Когда я запускаю код, я получаю следующее:
<ErrorResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
<Error>
<Type>Sender</Type>
<Code>MissingAuthenticationToken</Code>
<Message>Request is missing Authentication Token</Message>
</Error>
<RequestId>...</RequestId>
</ErrorResponse>
Официальная документация объясняет , как аутентифицировать запросы , представляя совершенно другой подход, который я использовал для S3.
Почему существует два подхода: один для Amazon S3, а другой, похоже, для любого другого сервиса?
Что я могу сделать, чтобы использовать для SNS старый подход, который я использовал для S3? Любой параметр, чтобы добавить в запрос, чтобы заставить его использовать старый подход?