【AWS】SSM Session Manager로 로컬에서 EC2 인스턴스에 연결
SSM Session Manger를 설정하는 방법은이 기사에서 다루지 않으므로 공식 문서을 참조하십시오.
SSM Session Manager라고 길기 때문에, 이하에서는 Session Manger로 약칭합니다
쉘 스크립트
작동 보장하는 OS는 MacOS입니다.
그 이외의 OS에서는 동작하지 않는 경우가 있으므로 양해 바랍니다
플러그인용
Session Manager를 사용하려면 로컬에 Plugin이 필요합니다.
다음 스크립트에서 지원하는 것은 Plugin 설치 및 제거입니다.
설치는 S3에 있는 Plugin zip 파일을 다운로드하여 로컬 PATH에 포함된/user/local/bin에 빌드합니다.
제거는 빌드된 스크립트를 삭제하기만 하면 됩니다.
plugin.bash#!/bin/bash
# ------------------------------------------
# SSM Session Manager Plugin
# https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
#
# this script features
# - install
# - uninstall
# ------------------------------------------
set -xeu
function install {
base_dir=$(cd $(dirname $0); pwd)
download_dir="/tmp/ssm"
if [ ! -d "$download_dir" ]; then
mkdir $download_dir
fi
pushd "$base_dir" > /dev/null
pushd "$download_dir" > /dev/null
curl -o "sessionmanager-bundle.zip" \
"https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip"
unzip sessionmanager-bundle.zip
sudo ./sessionmanager-bundle/install \
-i /usr/local/sessionmanagerplugin \
-b /usr/local/bin/session-manager-plugin
popd > /dev/null
popd > /dev/null
read -p "Do you remove the downloaded files ? [y/n] > " flag
case "$flag" in
"y")
rm -rf $download_dir ;;
"n") ;;
*)
echo "Please typing y or n"
exit 1 ;;
esac
}
function uninstall {
sudo rm -rf /usr/local/sessionmanagerplugin
sudo rm /usr/local/bin/session-manager-plugin
}
cmd="$1"
case "$cmd" in
"install")
install ;;
"uninstall")
uninstall ;;
*)
echo "Please specify install or uninstall in first argument"
exit 1 ;;
esac
Session용
이 스크립트를 사용하면 세션 시작 및 기록을 확인할 수 있습니다.
먼저 세션을 시작하려면 연결할 EC2의 인스턴스 ID가 필요합니다.
이를 자동으로 얻기 위해 연결된 EC2의 이름을 인수로 사용하고 aws ec2 describe-instances
명령으로 인스턴스 ID를 가져옵니다.
따라서 연결 대상 EC2의 이름조차 기억하면 연결할 수 있습니다.
session.bash#!/bin/bash
set -xeu
cmd="$1"
target_ec2_name="$2"
profile="$3"
if [ -z "$target_ec2_name" ]; then
echo "Please specify EC2 name in the second argument"
exit 1
fi
if [ -z "$profile" ]; then
echo "Please specify aws profile name in the third argument"
exit 1
fi
instance_id=$(aws ec2 describe-instances --output text \
--filters "Name=tag:Name,Values=$target_ec2_name" \
--query "Reservations[*].Instances[?Instance.State.Name==running].InstanceId" \
--region ap-northeast-1 --profile "$profile")
function start {
aws ssm start-session \
--target "$instance_id" \
--region ap-northeast-1 --profile "$profile"
}
function list {
aws ssm describe-sessions \
--state "History" \
--filters "key=Target,value=$instance_id" \
--region ap-northeast-1 --profile "$profile"
}
case "$cmd" in
"start") start ;;
"list") list ;;
*)
echo "Please specify start or list in the first argument"
exit 1 ;;
esac
Makefile
위의 Shell Script를 쉽게 실행할 수 있도록 Makefile을 작성했습니다.
Makefile.PHONY: session plugin
plugin:
bash plugin.bash $(cmd)
session:
bash session.bash $(cmd) $(name) $(profile)
플러그인 명령 인수 설명
$(cmd)는 install
또는 uninstall
입니다.
기능은 이름대로
session 명령 인수 설명
인수
설명
cmd
start
또는 list
를 지정하십시오 start는 Session 시작합니다 list는 Sesison의 역사를 볼 수 있습니다
이름
연결하려는 EC2 인스턴스의 이름을 지정합니다.
프로필
AWS profle를 나타냅니다. 적절한 IAM Role이 연결되어있는 IAM User의 프로파일을 지정하십시오.
Session Start 실행
세션을 시작해 보겠습니다.
make session cmd=start name=qiita profile=test
위의 명령을 실행해 보면 다음과 같습니다.
프롬프트가 sh-4.2$
이면 EC2에 연결할 수 있다는 것입니다.
덧붙여서 Session으로 로그인하는 유저를 SSMSessionRunAs로 태그 첨부해도 로그인 쉘은 초기화되지 않기 때문에, sh-4.2$
그대로입니다
이 Issue에서도 작성되었지만 로그인 쉘을 자동으로 변경하고 싶다면 다음과 같이하면 좋을 것 같습니다.
aws ssm start-session --target <INSTANCE_ID> --document-name AWS-StartInteractiveCommand --parameters command="bash -l"
개인적으로는 SSMSessionRunAs와 같이 간편하게 로그인 쉘을 지정할 수 있도록 해 주었으면 합니다.
참고
#!/bin/bash
# ------------------------------------------
# SSM Session Manager Plugin
# https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
#
# this script features
# - install
# - uninstall
# ------------------------------------------
set -xeu
function install {
base_dir=$(cd $(dirname $0); pwd)
download_dir="/tmp/ssm"
if [ ! -d "$download_dir" ]; then
mkdir $download_dir
fi
pushd "$base_dir" > /dev/null
pushd "$download_dir" > /dev/null
curl -o "sessionmanager-bundle.zip" \
"https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip"
unzip sessionmanager-bundle.zip
sudo ./sessionmanager-bundle/install \
-i /usr/local/sessionmanagerplugin \
-b /usr/local/bin/session-manager-plugin
popd > /dev/null
popd > /dev/null
read -p "Do you remove the downloaded files ? [y/n] > " flag
case "$flag" in
"y")
rm -rf $download_dir ;;
"n") ;;
*)
echo "Please typing y or n"
exit 1 ;;
esac
}
function uninstall {
sudo rm -rf /usr/local/sessionmanagerplugin
sudo rm /usr/local/bin/session-manager-plugin
}
cmd="$1"
case "$cmd" in
"install")
install ;;
"uninstall")
uninstall ;;
*)
echo "Please specify install or uninstall in first argument"
exit 1 ;;
esac
#!/bin/bash
set -xeu
cmd="$1"
target_ec2_name="$2"
profile="$3"
if [ -z "$target_ec2_name" ]; then
echo "Please specify EC2 name in the second argument"
exit 1
fi
if [ -z "$profile" ]; then
echo "Please specify aws profile name in the third argument"
exit 1
fi
instance_id=$(aws ec2 describe-instances --output text \
--filters "Name=tag:Name,Values=$target_ec2_name" \
--query "Reservations[*].Instances[?Instance.State.Name==running].InstanceId" \
--region ap-northeast-1 --profile "$profile")
function start {
aws ssm start-session \
--target "$instance_id" \
--region ap-northeast-1 --profile "$profile"
}
function list {
aws ssm describe-sessions \
--state "History" \
--filters "key=Target,value=$instance_id" \
--region ap-northeast-1 --profile "$profile"
}
case "$cmd" in
"start") start ;;
"list") list ;;
*)
echo "Please specify start or list in the first argument"
exit 1 ;;
esac
.PHONY: session plugin
plugin:
bash plugin.bash $(cmd)
session:
bash session.bash $(cmd) $(name) $(profile)
make session cmd=start name=qiita profile=test
aws ssm start-session --target <INSTANCE_ID> --document-name AWS-StartInteractiveCommand --parameters command="bash -l"
Reference
이 문제에 관하여(【AWS】SSM Session Manager로 로컬에서 EC2 인스턴스에 연결), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/homines22/items/4035c35aa8bd501bed22텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)