IAM Identity Center (旧 AWS SSO) 認証を利用して手元の端末から EC2 インスタンスの状態確認・開始・停止を行うシェルスクリプトを書きました。実行すると以下のようになります。同一リージョン内であれば複数インスタンス ID も指定できます。
$ ec2.sh
対象リージョン: us-west-2
対象インスタンス: i-xxxxxx
現在の状態:
# もしセッションが有効期限切れならここでブラウザが開かれログインが促されます
[
"stopped"
]
インスタンスを起動します:
{
"StartingInstances": [
{
"InstanceId": "i-xxxxxx",
"CurrentState": {
"Code": 0,
"Name": "pending"
},
"PreviousState": {
"Code": 80,
"Name": "stopped"
}
}
]
}
事前準備
IAM Identity Center 認証を利用するので、下記条件が満たされている必要があります。
- (1) IAM Identity Center ユーザをもっている。
- (2) そのユーザに EC2 操作を含む許可セットがアサインされている。
- (3) 手元の端末に AWS CLI がインストールされている。
- (4) 手元の端末に当該許可セットでログインする用のプロファイルが設定されている。
それぞれの設定手順は以下です。
- (1) AWS マネジメントコンソールの「IAM Identity Center」でユーザーを作成します。
-
(2) 例えば以下の手順で許可セットを設定できます。1
- 「IAM Identity Center → 許可セット → 許可セットの作成」で「カスタム許可セット」を選択、インラインポリシーに
{"Version": "2012-10-17", "Statement": [{"Effect": "Allow", "Action": ["ec2:StartInstances", "ec2:StopInstances", "ec2:DescribeInstances"], "Resource": "*"}]}を記入し、適当な名前で保存。 - 「IAM Identity Center → AWS アカウント」を開き、対象アカウントを選択し、「ユーザーまたはグループを割り当て」をクリックし、作成したユーザーを選択し、作成した許可セットを選択して「送信」する。
- そのユーザーとしてログインしアクセスポータル画面でアサインした許可セット名がアサインされていることを確認する。また、許可セット名の横の「アクセスキー」をクリックして開くモーダルから「SSO の開始 URL」「SSO リージョン」がコピーできるようにしておく (手順 (4) で必要)。
- 「IAM Identity Center → 許可セット → 許可セットの作成」で「カスタム許可セット」を選択、インラインポリシーに
-
(3) Windows なら
winget install -e --id Amazon.AWSCLIでインストールできます (これを実行するシェルは Git Bash でも PowerShell でもコマンドプロンプトでもよいですが、インストール後に開き直してaws --versionが通ることを確認します)。 -
(4)
aws configure ssoで設定します。- 開始 URL とリージョンは手順 (2) で確認したものをペーストする。
- ブラウザが開いてログイン画面が出るのでログインする。
- その後色々訊かれるが規定値でよい。
- 最後に訊かれる Profile name は例えば EC2StartStop にする (識別できればよい) (このプロファイル名をシェルスクリプトに記入する)。
シェルスクリプト
「設定ここから」の箇所を修正して利用ください。
ec2.sh
#!/usr/bin/bash
# ---------- 使い方 ----------
# ec2.sh # インスタンスの状態をみるだけで終わる
# ec2.sh 1 # インスタンスを開始
# ec2.sh 2 # インスタンスを停止
# ---------- 設定ここから ----------
profile="EC2StartStop" # EC2 操作許可をもつプロファイル名
region="us-west-2" # 対象インスタンスのリージョン
instance_ids=("i-xxxxxx" "i-yyyyyy") # インスタンスID
# ---------- 設定ここまで ----------
desc() {
AWS_PROFILE="$profile" aws ec2 describe-instances \
--region "$region" --instance-ids "${instance_ids[@]}" \
--query 'Reservations[].Instances[].State.Name'
}
start() {
AWS_PROFILE="$profile" aws ec2 start-instances \
--region "$region" --instance-ids "${instance_ids[@]}"
}
stop() {
AWS_PROFILE="$profile" aws ec2 stop-instances \
--region "$region" --instance-ids "${instance_ids[@]}"
}
# ---------- メイン処理 ----------
# 引数にかかわらずまずインスタンスの状態をみる
echo "対象リージョン: ${region}"
echo "対象インスタンス: ${instance_ids[@]}"
echo "現在の状態:"
desc
if [ $? -ne 0 ]; then
# 状態がみられなかったらログイン
echo "セッションが無効のためログインします..."
aws sso login --profile "$profile"
desc
fi
# 引数からフラグを読み取って 1 なら開始、2 なら停止
flag="${1:-0}"
case "$flag" in
1)
echo "インスタンスを起動します:"
start ;;
2)
echo "インスタンスを停止します:"
stop ;;
esac
-
開始・停止を許可するインスタンスを絞る場合は
"Resource": "*"でなく"arn:aws:ec2:us-west-2:account_id:instance/i-xxxxxx"のようにする必要がありますが、ec2:DescribeInstancesは"Resource": "*"でなければならないかもしれないのでステートメントを分ける必要があるかもしれません。 ↩