EC2上でシェルを書く時、何かとAWS CLIでリージョンやアカウントIDを使うことが多いですよね。
ただ、そのままアカウントIDを111222333444
のように埋め込んだり、リージョンをap-northeast-1
と書くのは、様々な環境で使い回す上ではなるべく避けたいと思ったので取得してみました。
アカウントIDの取得方法
アカウントIDはaws sts get-caller-identity
を使用して取得できます。
$ aws sts get-caller-identity
{
"Account": "111222333444",
"UserId": "AAAABBBBCCCCDDDDEEEE",
"Arn": "arn:aws:iam::111222333444:user/sample"
}
このようにAccountやUserID、IAMのARNがJSONで返ってくるので、ここから取得してあげましょう。
先程のコマンドからjq
を使用してパースして抜き出します。
jq
がない場合はインストールして下さい。
参考:jq コマンドの Linux への速攻インストール
$ aws sts get-caller-identity | jq -r '.Account'
> 111222333444
こんな感じでアカウントIDはOK
※2020/03/17追記
CLIの--queryオプションであれば、jqを使用せずとも抜き出せるとコメント頂きました。こちらの方が簡単ですね!
$ aws sts get-caller-identity --query 'Account' --output text
リージョンを取得する方法
リージョンは以下のコマンドで取得してみます。
$ curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e s/.$//
> ap-northeast-1
インスタンスのメタデータからAZの情報を取得できるので、最後の1文字を削除してあげればリージョン名になります。
シェルで使用する
AWSではサービスの情報を取得したり、何か情報をPUTしたりする際ARNを指定することが多いんですが、これの中にアカウントIDやリージョンがよく必要になります。
例えばSNSのトピックを指定する際のARNはこんな感じ。
arn:aws:sns:ap-northeast-1:111222333444:sample-topic
これは見ればわかると思いますが、
arn:aws:sns:【リージョン】:【アカウントID】:【トピック名】
のような法則で作られる文字列です。
シェルの中で変数に入れたい場合はこんな感じに変数で書いてあげましょう。
SNS_TOPIC_NAME="sample-topic"
REGION=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e s/.$//`
ACCOUNT_ID=`echo aws sts get-caller-identity | jq -r '.Account'`
SNS_TOPIC_ARN="arn:aws:sns:${REGION}:${ACCOUNT_ID}:${SNS_TOPIC_NAME}"
echo ${SNS_TOPIC_ARN}
> arn:aws:sns:ap-northeast-1:111222333444:sample-topic
こうすると他のアカウントや別リージョンで同じシェルを使いたい場合でも、トピック名だけを修正すればいいのでとても修正箇所が少なくて済みます。
誰かのお役に立てれば幸いです。