AWS System Manager(SSM)でEC2にSSHを実行! ポート解放なし

2019-08-14
amazon%20awslinuxubuntusshiamamazon%20ec2aws%20cliaws%20ssmamazon%20linux
    

目次

AWSのEC2インスタンスに対してAWS System Manager、通称SSMでSSHポートを解放せずSSHする方法の紹介です。

環境

session-manager-pluginとamazon-ssm-agent関連の設定は後ほど紹介します。 aws cliは省略します。

クライアント環境

macOS mojava

AWS CLI

1.16.215

$ aws --version
aws-cli/1.16.215 Python/3.7.3 Darwin/18.6.0 botocore/1.12.205

Session Manager Plugin

1.1.26.0

$ session-manager-plugin --version
1.1.26.0

リモート環境

Ubuntu 18.04

Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-1044-aws x86_64)

amazon-ssm-agent

2.3.687.0

$ sudo snap list amazon-ssm-agent
Name              Version    Rev   Tracking  Publisher  Notes
amazon-ssm-agent  2.3.687.0  1522  stable/…  aws✓       classic

クライアント環境のセットアップ

AWS CLIは導入済みのものとして話を進めます。

macOS に Session Manager Plugin をインストール

macOSの場合のインストール方法です。 まず、以下のコマンドを実行し、インストールします

# 作業スペースに移動
cd /tmp
# sessionmanager-bundleダウンロード
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
# unzip
unzip sessionmanager-bundle.zip
# インストールシェルの実行
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin

これで完了です。 インストールが正しく行われたか確認します。

session-manager-plugin

「The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.」と表示されれば成功です。

Linux(RedHat系) に Session Manager Plugin をインストール

# 64bitの場合
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
# 34bitの場合
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_32bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
# install
sudo yum install -y session-manager-plugin.rpm

Ubuntu に Session Manager Plugin をインストール

# 64bitの場合
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
# 34bitの場合
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_32bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
# install
sudo dpkg -i session-manager-plugin.deb

Linuxの場合もmacと同様にsession-manager-pluginコマンドでインストール状態を確認できます。

また、その他ログなどの設定やアンインストールについては awsの公式ドキュメント をご覧ください。

リモート環境のセットアップ (EC2)

次にEC2のセットアップを行います。

インストール

SSMエージェントのインストールは awsの公式ドキュメント にも記載されており、また、試した時点(2019/08/01)ではインスタンスにすでにインストールされていたので今後、新規に作成したインスタンスに対して改めてインストールする作業は不要になると思います。 ※ 古いAMIから作成したインスタンスにはインストールされていないようです。 ちなみに公式ドキュメントでは次のように触れています。

SSM エージェント は、デフォルトでは、2017 年 9 月以降の Amazon Linux 基本 AMI にインストールされます。SSM エージェント は、デフォルトで、Amazon Linux 2 AMI にもインストールされます。

Amazon ECS 対応の AMI のようにベースイメージではないその他のバージョンの Linux では、手動で SSM エージェント をインストールする必要があります。

プロキシを使用している Amazon Linux AMI から作成されたインスタンスは、Patch Manager オペレーションをサポートするために、現在のバージョンの Python requests モジュールを実行している必要があります。詳細については、「プロキシサーバーを使用する Amazon Linux インスタンス上の Python リクエストモジュールをアップグレードする」を参照してください。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html

手動でインストールする場合は以下の方法で行います。

Amazon Linux2 (intel 64bit ※t2インスタンスなど)

インストール

sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

状態の確認

sudo systemctl status amazon-ssm-agent

起動

sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent

Ubuntu 18.04 へのインストール

UbuntuもAmazon Linuxと同様にamazon-ssm-agentの手動インストールは不要でした。

デフォルトでは、SSM エージェント は、20180627 以降の識別子のある Ubuntu Server 18.04 および 16.04 LTS 64 ビット AMI にインストールされます。バージョン 16.04 AMI の詳細については、64 ビット Ubuntu Server 16.04 インスタンスでの SSM エージェント のインストールについて を参照してください。

SSM エージェント オンプレミスサーバーにインストールする場合やエージェントを再インストールする場合は、次のスクリプトを使用できます。ダウンロードの URL を指定する必要はありません。snap コマンドでは、エージェントが Snap アプリストア https://snapcraft.io から自動的にダウンロードされます。

インストール

sudo snap install amazon-ssm-agent --classic

実行状態の確認

sudo snap list amazon-ssm-agent

開始

sudo snap start amazon-ssm-agent
sudo snap services amazon-ssm-agent

EC2へのIAMロールの割り当て

IAMロール作成

SSMからの接続を許可するIAMロールを作成しEC2に割り当てます。

  • IAM(https://console.aws.amazon.com/iam/home#/home)に移動
  • EC2用のロール作成
  • 作成したロールに ポリシー : AmazonEC2RoleforSSM を割り当て
  • 作成したロールをEC2に割り当て

シェルログインをテスト

ロールが正しく割り当てられるとaws ssm start-sessionで接続することが出来ます。 試しにubuntuで接続テストをしてみます。Amazon Linuxの場合も同様に接続することができます。

$ aws ssm start-session --target i-XXXXXXXXXXXXXXX

Starting session with SessionId: botocore-session-0123456789abcdefghijk
$ whoami  
ssm-user
$ sudo su  - ubuntu
ubuntu@ip-X-X-X-X:~$

インスタンスにSSHする

ワンライナーで接続

SSHでProxyCommandを用いて次のように条件を設定することで接続することができます。

ssh \
ユーザ名@i-XXXXXXXXXXXX \
-i ~/.ssh/path/to/key.pem \
-o ProxyCommand=" sh -c \"aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'\""

ssh_configに設定を記述する

ssh configに設定を書いておくと簡単に接続することができます。

Host my-server
    HostName i-XXXXXXXXXX
    User ユーザ名
    ServerAliveInterval 300
    IdentityFile ~/.ssh/path/to/key.pem
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
ssh my-server

SSHできない場合

数日後に、上記の手順でSSH接続を実行したところ正常に接続できなくなりました。 原因はわかりませんでしたが、リモート側のamazon-ssm-agentをアップデートしたところ繋がるようになりました。 amazon-ssm-agentのアップデートはマネジメントコンソールから、System Managerを選択し、ランコマンドからAWS-UpdateSSMAgentを実行することでアップデートできます。 ただSSMのアップデートは定期的に必要なためcron実行にしました。

ssmのcreate-associationでcron実行するには次のように実行します。 実行すると次のようなJSONが返ってきます。

$ aws ssm create-association --targets Key=tag:Name,Values=instanceX --name AWS-UpdateSSMAgent --schedule-expression "cron(0 8 * * ? *)"
{
    "AssociationDescription": {
        "Name": "AWS-UpdateSSMAgent",
        "AssociationVersion": "1",
        "Date": 1565771993.094,
        "LastUpdateAssociationDate": 1565771993.094,
        "Overview": {
            "Status": "Pending",
            "DetailedStatus": "Creating"
        },
        "DocumentVersion": "$DEFAULT",
        "AssociationId": "abcdefg-1234-1234-abcd-abcd1234",
        "Targets": [
            {
                "Key": "tag:Name",
                "Values": [
                    "instanceX"
                ]
            }
        ],
        "ScheduleExpression": "cron(0 8 * * ? *)"
    }
}

この例ではタグで実行対象を決定してますが、次のようにインスタンスidで指定することも可能です。

aws ssm create-association --targets Key=instanceids,Values=i-XXXXXXXXXXXXXXXXX,i-YYYYYYYYYYYYYYYYY --name your document name --schedule-expression "cron(0 2 ? * SUN *)"

参考

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-verify

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html

http://blog.serverworks.co.jp/tech/2019/07/30/sessionmanagerassumerole/

https://qiita.com/hayao_k/items/78b5bfe030ad8a053e93

https://dev.classmethod.jp/cloud/ssm-session-manager-from-mac-to-linux-ec2/

https://dev.classmethod.jp/cloud/aws/session-manager-launches-tunneling-support-for-ssh-and-scp/

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/reference-cron-and-rate-expressions.html

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-state-cli.html

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html

https://dev.classmethod.jp/cloud/aws/session-manager-launches-tunneling-support-for-ssh-and-scp/

    

関連記事

AWS Amplify で コンテナベースのデプロイを行い REST API を構築
検証した環境 やってみる 初期準備 パイプラインを確認 終了処理 参考 AWS Amplify で コンテナベースのデプロイを行い REST API を構築した際のメモです。 検証した環境 amplify 5.1.…

Pythonでソケット通信を実装しメッセージの送受信を行う
ソース server.py client.py 動かしてみる 参考 Pythonでソケット通信を実現する方法です。 ソース server.py サーバ側のソースです。 client.py…

CentOS で スマートにプロキシを設定する
コマンドライン上で通す よりスマートに設定する 設定ファイルに記述 CentOSでプロキシを通す設定のメモです。 プロキシ環境で yum/dnf でリポジトリを更新する場合や、curl/wget…

MySQL8.0 で利用できるパラメータを表示する方法
オプションの表示 mysql8.0でmy.cnfなどで利用できるパラメータ一覧を出す方法。 オプションの表示 オプションの表示は次のコマンドで実施できます mysqld — The MySQL Server 【MySQLパラメーター比較資料】MySQL 5.…

CentOS に MySQL8.0をインストールする
はじめに 環境 起動 MySQLインストール my.cnf の設定 プロセス立ち上げ エラー The designated data directory /var/lib/mysql/ is unusable. You can remove all files…

PHP-FPM(php7.4) Apache2.4 on Ubutnu20.04 Webサーバ構築
環境 パッケージの更新 Apache と PHP のインストール Apache のサービスを開始する PHPファイルを作成 参考にしたサイト Ubuntu20.04 に PHP7.4 + Apache2.4 をインストールしてWeb…

UNIXドメインソケット通信 vs INETドメインソケット通信 php-fpmで動作させる場合の違いについて
結論 ソケット通信について ソケットについて ソケット通信の種類 UNIXドメインソケット通信を行う場合のメリット 参考にしたサイト php-fpm の設定方法で調べた際にIPとポートで設定するパターンとUNIX…

Amplify CLI のインストール
Amplify CLI のインストール Amplify CLI の設定 バックエンド環境作成 Amplify CLI のインストールから設定まで Amplify CLI をインストール 設定 Amplify アプリを初期化 Amplify CLI…

AWS Amplify に Next.js (SSG) で作ったアプリをデプロイする
はじめに 操作 Next.js (React) アプリの作成、Gitへのプッシュ AWS Amplifyでプロジェクト作成 参考にしたサイト この記事では、React / Next.js アプリケーションを作成し、AWS Amplify…

homebrew-core is a shallow clone. 対処法
homebrew で homebrew-core is a shallow clone.と 表示されたエラー 対処法 homebrew で homebrew-core is a shallow clone.と homebrewでupdate…

最新の投稿

Node.js で作成した REST API を Docker化
Node.jsでREST APIを作成 コンテナ化 コンテナ化定義 コンテナ化作業 参考 Node.js で作成した REST API を Docker化した際のメモです。 Node.jsでREST APIを作成 まずはNode.js…

JavaScriptで優先度付きキューを実装する
優先度付きキューについて ソース 参考 JavaScriptで優先度付きキュー (プライオリティキュー) を実装する 優先度付きキューについて 具体的には次のような機能があります。 キューに対して要素を優先度付きで追加 (push…

AWS Amplify で コンテナベースのデプロイを行い REST API を構築
検証した環境 やってみる 初期準備 パイプラインを確認 終了処理 参考 AWS Amplify で コンテナベースのデプロイを行い REST API を構築した際のメモです。 検証した環境 amplify 5.1.…

Pythonでソケット通信を実装しメッセージの送受信を行う
ソース server.py client.py 動かしてみる 参考 Pythonでソケット通信を実現する方法です。 ソース server.py サーバ側のソースです。 client.py…

next_permutationをJSで実装する
ソース 使い方 参考 C++で提供されている順列を生成する next_permutation のJS実装です。 ソース 順列が存在する場合はtrueを返し、そうでなければfalse…

応用情報技術者試験の合格体験記
受験時のステータス 受験結果 対策 スケジュール 午前問題 午後問題 参考書等 令和…

[JS]ラジアンから度数に度数からラジアンに変換する
コード 度数からラジアンへ ラジアンから度数へ サンプル ラジアンから度数に度数からラジアンに変換する際のスニペット。 コード 度数からラジアンへ ラジアンから度数へ サンプル

CentOS8 に Python + OpenCV をインストール
インストール テスト CentOS8 で標準で提供されているパッケージで Python + OpenCV 環境を構築する方法です。 検証した環境は CentOS8.3 (Docker) です。 インストール まず opencv…

[Perl] CentOS8 に plenv をインストール
インストール Step1 事前準備 Step2 PATHを通す (README通りにインストール) Step2 PATHを通す ($HOME以外にplenvをインストール) Step3 Perlインストール Step4 cpanmインストール CentOS…

JS/TSのclassでclass名を取得する
コード JS/TSのconstructorを利用して自分自身のクラス名を取得する際のメモ。 コード このコードの結果は次のようになります。

Tags

Dates

s-yoshiki
s-yoshiki
githubtwitterqiita
Web作ってますが、インタラクティブなプログラミングも好きです。
JavaScript / Vue / node.js / PHP / AWS / OpenCV
© 2021   404 motivation not found