EC2インスタンスメタデータからワンライナーでクレデンシャルを取得してみた

地味な効率化楽しいですよね。EC2のクレデンシャルを取得するための2回を1回にするワンライナーです。
2022.10.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

みなさん、EC2のクレデンシャル取得してますか?(挨拶

今回はタイトル通りEC2のインスタンスメタデータからワンライナーでクレデンシャルを取得する方法を考えたので紹介します。

ワンライナー

こちらです。インスタンスメタデータはv1前提です。

[ec2-user@ip-172-31-14-109 ~]$ mu=http://169.254.169.254/latest/meta-data/iam/security-credentials/;curl -s $mu | echo $mu$(cat) | xargs -n1 curl
{
  "Code" : "Success",
  "LastUpdated" : "2022-10-07T16:45:41Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "ASIAxxxxxxxxxxxxxxxx",
  "SecretAccessKey" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "Token" : "xxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==",
  "Expiration" : "2022-10-07T23:21:32Z"
}

背景とか解説とか

EC2のクレデンシャルを取得するのはメタデータにアクセスするだけなので、どのようにやってもよくいくらでもやり方がありますし、ワンライナーにするほど手間ではありません。

通常は1度目にのhttp://169.254.169.254/latest/meta-data/iam/security-credentials/パスにリクエストして、2度目にレスポンスにあるIAM Role名を入れたhttp://169.254.169.254/latest/meta-data/iam/security-credentials/{IAM Role名}のパスにリクエストするだけです。

ただ毎回2ステップだと面倒なのでまとめました。

今回のポイントですが、jqを利用していないところです。jqを利用すると受け取ったjsonをいい感じに整形したりが簡単にできるため、よくこれを利用したものを見かけるのですが、EC2でAmazon Linux 2を立ち上げたとき、デフォルトで入っていないなどの欠点があります。

パッと立ち上げてサクッとクレデンシャルを取得したいので、jqに頼らない方針で作りました。

シェル芸詳しくないので、もっと効率的なやり方あるぜ、とかもっと汎用的なやつがあるぜ、という方がいたらぜひブログとかに書いてください。

ちなみに、実はこのワンライナーは今回作ったのではなく下記記事で利用していました。個別のブログ化をしようと思っていたのですが、気がついたら1年近く経っていました。

まとめ

EC2のクレデンシャルを取得するワンライナーを紹介しました。

地味な効率化好きなので、また思いついたら書き残しておきます。