💬

curlでec2インスタンスからOpenSearchにリクエストをする

2024/01/25に公開

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"}

と怒られてしまいます。

https://repost.aws/ja/knowledge-center/anonymous-not-authorized-opensearch
に説明がある通り、リクエストが署名されていないためらしいです。

この署名に関しては、
https://chariosan.com/2021/09/26/curl_aws-sigv4_iamrole_access_opensearch/
に詳しく記載されています。

ただ、上記の記事のコードをそのまま実行しても、$ROLE_NAMEの中身が空になりました。
これは
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
に説明があるのですが、
Instance Metadata Service Versionの1ではなく、2が要求されているからでした。

Instance Metadata Service Versionについては下記に説明があります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html

なので、Instance Metadata Service Version 2が要求されている場合は、
https://chariosan.com/2021/09/26/curl_aws-sigv4_iamrole_access_opensearch/
に記載されているラッパースクリプトは以下のように書き換えることができるかと思います。

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