はじめに
下記リンクで「IAMロールでアクセス制限したOpenSearch(旧: ElasticSearch)にリクエストする」内容を紹介していますが、こちらはIMDSv1を前提としているかと思います。本記事ではIMDSv2の場合に同様のことを実現する方法を紹介します。
https://chariosan.com/2021/09/26/curl_aws-sigv4_iamrole_access_opensearch/
結論
メタデータ情報をトークン付きでリクエストしてください
概要
・下記に記載の通りメタデータを取得する際にはトークンが必要になる
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html#instance-metadata-v2-how-it-works
・ロールに関連するメタデータは下記のパスから取得できるが2番目の方のパスを使って取得する→トークン情報は取得できるがエラーが発生するため(もし原因がわかればどなたか教えてください)
/meta-data/identity-credentials/ec2/security-credentials/ec2-instance/
/meta-data/iam/security-credentials/ →こっち
The request signature we calculated does not match the signature you provided
前提
タスクロール→対象サービスへの必要アクセスを許可
パスワード認証を利用してロールマッピング
jqコマンド必要
curlコマンドは7.~以上が必要
実施内容
#環境変数設定
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
ROLE_NAME=`curl -H "X-aws-ec2-metadata-token: $TOKEN" -s 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 -k -XGET -H "Content-Type: application/json" 'https://<OpenSearchドメイン>/_cat/indices' -H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" --aws-sigv4 "aws:amz:${REGION}:${SERVICE}" --user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}"