TransWikia.com

alias の中で動的に実行したコマンド結果を使いたい

スタック・オーバーフロー Asked on November 18, 2021

コマンドの結果を引数にしてコマンドを実行する alias を書きたいです

具体的には特定の name のついた ec2 に SSM ログインするコマンドを書きたいので

aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "api") | .InstanceId'

このコマンド結果を最後につけて

aws ssm start-session --target <ここに結果を入れたい>

を実行する alias を作りたいです

alias api-login="aws ssm start-session --target $(aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "api") | .InstanceId')"

と定義してしまうと定義時に中身が展開されてしまって

api-login='aws ssm start-session --target i-xxxxxxxx'

となって値が固定されてしまいます
コマンド実行時に内側も実行したいのですがどう書けばいいでしょうか

3 Answers

ちなみにAWS CLIですが

aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "api") | .InstanceId'

jqを使わなくても

aws ec2 describe-instances --filters Name=tag-value,Values=api --query Reservations[*].Instances[*].[InstanceId] --output text

と書けますし、タグ名をきちんと指定すると

aws ec2 describe-instances --filters Name=tag:タグ名,Values=api --query Reservations[*].Instances[*].[InstanceId] --output text

と書けます。

Answered by sayuri on November 18, 2021

Shellじゃないのでオフトピかもしれませんが、awscli-aliases を使って AWSCLIのAliasにする方法もあります。設定ファイルは $HOME/.aws/cli/alias にあるので $HOME/.aws/config などと一緒に管理しておけば環境移行も楽だと思います。

api-login =
  !f() {
    target=$(aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "api") | .InstanceId')
    aws ssm start-session --target $target
  }; f

実行例

$ aws api-login

Starting session with SessionId: xxxxxx-00000000000000000
sh-4.2$ whoami
ssm-user

Answered by take88 on November 18, 2021

alias を使いたければ、ダブルクォートではなくシングルクォートで囲えば良いです。$(...) の中身は、ダブルクォートだと文字列として評価される際に展開されますが、シングルクォートだとコマンドとして評価される際に展開されます。

ですが、このくらい複雑になるのであれば alias ではなくて shell の関数にする方がコードに説明がつけられて見やすくなりそうです。

api-login () {
    local instance_id="$(aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.Tags[].Value == "api") | .InstanceId')"
    aws ssm start-session --target "${instance_id}"
}

Answered by nekketsuuu on November 18, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP