AWS で踏み台の先にある EC2 にタグで scp するスクリプトを書いたので紹介します。
現在は Session Manager を使って scp をすると踏み台が不要になるので、このようなスクリプトは書かなくても大丈夫です。設定方法は以下の記事に詳しく書いたので参考にどうぞ。
-
さらば踏み台サーバ。Session Managerを使ってEC2に直接SSHする
2019年9月の AWS Systems Manager のアップデートにより、セッションマネージャーを使用して、クライ ...
続きを見る
踏み台インスタンスの先にある EC2 インスタンスに scp するスクリプト
やっていることは単純で、aws-cli を使って踏み台インスタンスの public ip を取得し、引数で渡されたタグ名を使って scp したいインスタンスの private ip を取得して scp のコマンドに渡しているだけです。
aws-scp-tag
#!/usr/bin/env bash
set -e
progname=$(basename $0)
# check parameters
if [ "$1" == "" ] || [ "$1" == "-h" ]; then
echo "Usage: ${progname} <tag:Name>"
echo "Ex: ${progname} web01"
exit 0
fi
bastion_tag_name=bastion
bastion_user=admin
bastion_port=22
bastion_ssh_key=~/.ssh/id_rsa_ghe
if [[ ${param[0]} =~ : ]]; then
remote_tag_name=`echo ${1} | cut -d ':' -f 1`
elif [[ ${param[1]} =~ : ]]; then
remote_tag_name=`echo ${2} | cut -d ':' -f 1`
fi
remote_user=ec2-user
remote_port=22
remote_ssh_key=~/.ssh/id_rsa_ghe
# find bastion's public ip
bastion_public_ip=`aws ec2 describe-instances --query "Reservations[0].Instances[0].PublicIpAddress" --filters "Name=tag:Name,Values=${bastion_tag_name}" "Name=instance-state-name,Values=running" --output=text`
if [ "${bastion_public_ip}" == "None" ]; then
echo "The bastion instance's public_ip is not found"
exit 1
fi
# find remote host's private ip
remote_private_ip=`aws ec2 describe-instances --query "Reservations[0].Instances[0].PrivateIpAddress" --filters "Name=tag:Name,Values=${remote_tag_name}" "Name=instance-state-name,Values=running" --output=text`
if [ "${remote_private_ip}" == "None" ]; then
echo "The ${remote_tag_name} instance is not available"
exit 1
fi
# scp remote host through bastion
scp -P ${remote_port} -i ${remote_ssh_key} \
-o ProxyCommand="ssh -p ${bastion_port} -i ${bastion_ssh_key} -W %h:%p ${bastion_user}@${bastion_public_ip} " \
${1/${remote_tag_name}/${remote_user}@${remote_private_ip}} \
${2/${remote_tag_name}/${remote_user}@${remote_private_ip}}
使い方
AWS CLI の設定を済ませておき、aws ec2 describe-instances
コマンドを実行できるようにしておきます。
上記スクリプトを適当な名前で保存して実行権限を与えます。今回は aws-scp-tag とします。
$ chmod +x aws-scp-tag
上記スクリプトの remote_tag_name
以外の変数を自身の環境のものに書き換えます。
bastion_tag_name=bastion
bastion_user=ec2-user
bastion_port=22
bastion_ssh_key=~/.ssh/id_rsa
if [[ ${param[0]} =~ : ]]; then
remote_tag_name=`echo ${1} | cut -d ':' -f 1`
elif [[ ${param[1]} =~ : ]]; then
remote_tag_name=`echo ${2} | cut -d ':' -f 1`
fi
remote_user=ec2-user
remote_port=22
remote_ssh_key=~/.ssh/id_rsa
設定は以上です。あとは scp コマンドと同じような形で使えます。たまに使う -r オプションを渡せるようにしようかな・・・。
$ aws-scp-tag ./example.txt ec2-tag-name:/home/ec2-user
SSH バージョン
SSH コマンドバージョンも書きました。
-
AWSで踏み台の先にあるEC2にタグでsshする
AWS で踏み台の先にある EC2 にタグで ssh ログインするスクリプトを書いたので紹介します。 現在は Sessi ...
続きを見る