여러 EC2를 시작한 후 모든 EC2에 SSH 연결을위한 TeraTerm 매크로 파일을 만드는 Shell 스크립트

부하 시험을 실시하기 위해 동일한 구성의 EC2를 15대 출시하여 Teraterm에서 SSH 접속 부하 시험을 실시하고 있었지만, 비용 절감을 위해 EIP를 사용하지 않고 부하 시험을 실시하지 않을 때는 중지하기로 결정했습니다.
그렇다면 물론 EC2를 시작할 때마다 연결 대상 IP가 변경되므로 매번 15대의 IP를 Teraterm에 입력해야 합니다.

그래서 EC2를 여러 대 시작한 후, 접속처의 IP를 취득해, 시작한 모든 EC2에 SSH 접속을 실시하는 Teraterm 매크로 파일을 작성하는 Shell 스크립트를 만들기로 했습니다.

사전 준비



시작하려는 EC2 태그에


NAME
VALUE


ttl
true


를 등록해 둡니다.

주제



쉘 스크립트


※使用する際は
<profile>→AWS-CLIのプロファイル名、
<keypath>→接続に使うSSHKeyのフルパス
に置き換えてください。
# aws cliのプロファイル
AWS_PROFILE_NAME=<profile>
# リージョン
REGION=ap-northeast-1

# 起動するEC2インスタンスリストを取得
INSTANCES_ID_LIST=$(
    aws ec2 describe-instances \
        --region $REGION \
        --profile $AWS_PROFILE_NAME \
        --output text \
        --filters "Name=tag:ttl,Values=true" \
        --query 'Reservations[*].Instances[*].InstanceId' |
        sed -e "s/[\r\n]\+//g"
)

# EC2インスタンスを起動する
INSTANCES=$(
    aws ec2 start-instances --instance-ids $INSTANCES_ID_LIST \
        --region $REGION \
        --profile $AWS_PROFILE_NAME \
        --output text &&
        aws ec2 wait instance-running --instance-ids $INSTANCES_ID_LIST \
            --region $REGION \
            --profile $AWS_PROFILE_NAME \
            --output text
)

# パブリックIPアドレスを取得
INSTANCES_IP=($(
    aws ec2 describe-instances --instance-ids $INSTANCES_ID_LIST \
        --region $REGION \
        --profile $AWS_PROFILE_NAME \
        --query 'Reservations[*].Instances[*].PublicIpAddress' \
        --output text |
        sed -e "s/[\r\n]\+//g"
))

# TeraTermマクロファイル(.ttl)を作成する
echo '' >loadtest-connecct.ttl | sed -e "s/[\r\n]\+//g" >loadtest-connecct.ttl
cat <<-EOS >>loadtest-connecct.ttl

        $(
    echo strdim ip ${#INSTANCES_IP[@]}
    for ((i = 0; i < ${#INSTANCES_IP[@]}; i++)); do
        echo "ip[$i] = '${INSTANCES_IP[i]}'"
    done
    echo for i 0 $((${#INSTANCES_IP[@]} - 1))
    echo username = "'ec2-user'"
    echo hostname = ip[i]
    echo keyfile = "'<keypath>'"

    echo msg = hostname
    echo strconcat msg "':22 /ssh /auth=publickey /nosecuritywarning /user='"
    echo strconcat msg username
    echo strconcat msg "' /keyfile='"
    echo strconcat msg keyfile
    echo connect msg
    echo unlink
    echo next
)

EOS


하고 있는 일



하고 있는 일은 서두에 기술한 대로입니다.
  • 태그에 ttl = true가 정의 된 EC2 인스턴스 목록을 가져옵니다
  • 얻은 모든 EC2 인스턴스 시작
  • 시작된 인스턴스의 공용 IP 가져오기
  • 획득 한 공용 IP를 사용하여 SSH 연결을 수행하는 TeraTerm 매크로 파일을 히어 문서로 만듭니다.

    동작 확인



    이번 연결하고 싶은 EC2는 이쪽입니다.
    ttl1,ttl2,ttl3 각각 ttl=true 태그를 정의합니다.


    shell을 실행하면 EC2가 시작되고 ttl 파일이 생성됩니다.


    내용을 살펴보겠습니다.

    생성된 ttl 파일의 내용


    strdim ip 3
    ip[0] = '3.112.15.xxx'
    ip[1] = '35.72.3.xxx'
    ip[2] = '18.181.203.xxx'
    for i 0 2
    username = 'ec2-user'
    hostname = ip[i]
    keyfile = "'<keypath>'"
    msg = hostname
    strconcat msg ':22 /ssh /auth=publickey /nosecuritywarning /user='
    strconcat msg username
    strconcat msg "' /keyfile='"
    strconcat msg keyfile
    connect msg
    unlink
    next
    

    시작된 EC2의 공용 IP 배열을 만든 후 공용 IP 배열에 대해 루프 처리를 수행하고 SSH 연결을 시도하고 있습니다.
    실제로 TeraTerm 매크로를 실행하면, 기동한 EC2 대수분의 TeraTerm이 일어나 SSH 접속해 줍니다.

    끝에



    이 shell 스크립트를 응용하면 여러 대 서버에 대해 동일한 파일을 일괄적으로 SCP 전송하는 스크립트 등을 쉽게 만들 수 있다고 생각합니다.
    부디 커스터마이즈 해 편리한 TeraTerm 라이프를 보내는 것과 동시에, 기사등에서 아웃풋 쉐어 해 모두 행복하게 합시다.
  • 좋은 웹페이지 즐겨찾기