💬
curlでec2インスタンスからOpenSearchにリクエストをする
Saleshubの安田です。
疎通テストとしてcurlでec2インスタンスからOpenSearchにリクエストを出す機会があったのですが、その時にうまく行かなかったことと、どうやって解決したかについて書いてみます。
まず最初素直にcurl
コマンドを実行したところ、
$ curl https://OpenSearchエンドポイント/_cat/indices
$ {"Message":"User: anonymous is not authorized to perform: es:ESHttpGet because no resource-based policy allows the es:ESHttpGet action"}
と怒られてしまいます。
に説明がある通り、リクエストが署名されていないためらしいです。
この署名に関しては、
に詳しく記載されています。ただ、上記の記事のコードをそのまま実行しても、$ROLE_NAME
の中身が空になりました。
これは
に説明があるのですが、
Instance Metadata Service Versionの1ではなく、2が要求されているからでした。
Instance Metadata Service Versionについては下記に説明があります。
なので、Instance Metadata Service Version 2が要求されている場合は、
に記載されているラッパースクリプトは以下のように書き換えることができるかと思います。TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
ROLE_NAME=`curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/`
CRED=`curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/${ROLE_NAME}`
AWS_ACCESS_KEY_ID=`echo $CRED | jq -r ".AccessKeyId"`
AWS_SECRET_ACCESS_KEY=`echo $CRED | jq -r ".SecretAccessKey"`
AWS_SESSION_TOKEN=`echo $CRED | jq -r ".Token"`
REGION="ap-northeast-1"
SERVICE="es"
curl -s "$@" -H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" \
--aws-sigv4 "aws:amz:${REGION}:${SERVICE}" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}"
先頭行でTOKEN
を取得し、curlのヘッダX-aws-ec2-metadata-token
に$TOKEN
をセットすることで、メタデータがが取得できるようになり、OpenSearchへのリクエストができるようになります。
「curlでec2インスタンスからOpenSearchにリクエストしようとしたけど、結果が取得できない」という方の参考情報になれば幸いです。
上記、参考サイトを記載くださった方々と、上記試行錯誤に関してアドバイスをくれた@uro3に感謝です。
Discussion