Upgrade to Pro — share decks privately, control downloads, hide ads and more …

シェルスクリプトでAWSをいい感じに使いたい

shimo
August 04, 2022
11

 シェルスクリプトでAWSをいい感じに使いたい

2022/08/04(木) JAWS-UG朝会 #36 LT

shimo

August 04, 2022
Tweet

Transcript

  1. 自己紹介 名前 : shimo : @shimo_s3 職業 : フリーランスのITエンジニア AWS:

    認定12冠、Community Builder 好き : 自動化、データ分析、サーバレス 3
  2. 個人的な好み シェルスクリプトを使って、AWS操作を自動化するのが好き 4 いいところ • 自動化は嬉しい ◦ 覚えることが減る ◦ 時短できる

    ◦ 気分がよくなる(?) 課題 • そもそも、Step by Stepでもできる • オレオレ魔改造になりがち • 作成でハマって時間かかる • 環境依存がある ※ここでのシェルスクリプトは、AWS CLIやLinux/Unixコマンドをまとめているもの、という緩い意味で使っています
  3. これまで作ったもの (英語Mediumで投稿済) • EC2にSSHする • AWS VPN client が起動しているか確認する •

    EC2のパラメータをポップアップで受け取る • コマンド前後でコメントアウトをトグる • Pre-commitでオレオレルールを確認をする • CDK synthの出力を短くする • Terraformのstate showをGUI的にする • Serverless Frameworkでcdk synth的なことをする • どこにあるファイルでもGithubでバックアップする 5 このあと説明
  4. EC2インスタンスにSSH接続する 条件 と Step by Stepでの手順 • VPN接続を確認すること 目で確認する👀 • 複数EC2から選択できること

    instance-id(i-xxxx)をメモっておく • 停止状態からスタート(IPが変わる) 起動 & IP確認 & SSH 6 aws ec2 start-instances --instance-ids i-xxxx aws ec2 describe-instances --instance-ids i-xxxx ssh -i ssh_key ec2-user@ip_address 次ページからは、これらの手順をシェルスクリプトでまとめていきます
  5. 1. VPN接続しているか確認する 7 • (Macで)AWS-VPN Client が起動し ていると ps ax

    で AWS, isAliveが見 つかる • なければ起動画面を開いてexit check_vpn_is_alive(){ echo -n "Check vpn ... " vpn_alive=$(ps ax | grep AWS | grep isAlive) if [ -z "$vpn_alive" ]; then echo "Please start VPN!" open -a "AWS VPN Client" exit else echo "OK" fi }
  6. 2. EC2は複数から選択 8 • 引数argを受け取って選択する • 環境変数を作っておく EC2_ID_1=i=xxxxx, EC2_ARG_1=arg1, MY_PEM_1=path/mypem.pem

    • $ bash file.sh の引数arg(関数内$1) がなければエラーにする set_args(){ arg1=$EC2_ARG_1 arg2=$EC2_ARG_2 if [[ $1 == "$arg1" ]]; then echo "Mode: "$1 INSTANCE_ID=$EC2_ID_1 MY_PEM=$MY_PEM_1 elif [[ $1 == "$arg2" ]]; then echo "Mode: "$2 INSTANCE_ID=$EC2_ID_2 MY_PEM=$MY_PEM_2 else echo "arg is required:""[$arg1, $arg2]" exit fi }
  7. 3. EC2を起動してIP(dns_name)を受け取る 9 • start-instancesで起動。出力は 2>$1 > /dev/null で捨てる get_ec2_public_dns_name(){

    INSTANCE_ID=$1 public_dns_name=$( aws ec2 describe-instances --instance-ids $INSTANCE_ID | \ jq '.Reservations[0].Instances[].PublicDnsName' | \ tr -d '"' ) echo $public_dns_name } aws ec2 start-instances --instance-ids $INSTANCE_ID 2>&1 > /dev/null • describe-inscetancesの結果をjqでdns_nameだけ受け取る
  8. 4. SSHログインする 10 while : do public_dns_name=$(get_ec2_public_dns_name $INSTANCE_ID) if [[

    "$public_dns_name" != '' ]]; then echo "public_dns_name: "$public_dns_name echo "Connecting..." ssh -oStrictHostKeyChecking=no -i $MY_PEM ec2-user@$public_dns_name if [[ "$?" == "0" ]]; then break fi fi echo "Wait..." sleep 5 done • dns受け取り • 失敗したら5秒 待ってリトライ (よくやる方法)
  9. 1〜4を.shファイルにまとめれば、できあがり • 順番に.shに書いていくだけ ◦ 関数化する(好み) • 実行 ◦ bash path/to/hoge.sh

    arg • エイリアス登録すると、より楽に ◦ alias myssh=`bash path/to/hoge.sh` ◦ 引数を受けるときのエイリアス登録は注意 (省略) 11