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

2019-08-14
amazon%20awslinuxubuntusshiamec2aws%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/

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

関連記事

GitHub Actions で Gatsby をビルドし Amazon S3 にデプロイする
GitHub Actions について あらかじめ準備しておくもの AWS IAM ユーザを環境変数にセットする workflowの記述 ビルド バッジを利用する 終わりに 参考にしたところ Gatsbyで作った静的サイトを、GitHub Actions…

WordPressやめます Gatsbyに移行しました
これまでのWordPress運用 なぜWordPressを捨てるのか? なぜGatsbyを利用するのか? gatsbyについて WordPressから記事の救出 移行対象記事の抽出 記事の置換 Gatsbyテーマの作成 Gatsby…

Ansible で Docker に LAMP環境を構築するハンズオンを作った
リポジトリ リポジトリ構成 Docker構成 Ansible role の構成 プロビジョニングの実施 ansibleでdocker上にApache MariaDB PHP…

AWS BlackBeltを写経する EC2編
問われやすいサービス EC2 AWSサービス別資料 https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/ 問われやすいサービス EC2 Amazon EC2 (201…

Macでも利用できるDBクライアント MySQL PostgreSQL Oracle など
デスクトップ系ツール TablePlus DBeaver MySQL Workbench Sequel pro Webアプリケーション phpMyAdmin Adminer 参考 Macで利用できるDB (MySQL PostgreSQL Oracle…

DockerでMySQL5.1.73を利用する。docker-composeから起動
Dockerのインストールから実行まで docker-compose から起動 詳細 Docker から MySQL 5.1.73 を利用する。 Dockerのインストールから実行まで docker imageの pull。 119MB…

Proxy環境下でcurlを実行する
コマンドオプションで設定する 環境変数に設定する curlrc に記述する おまけ: curlのオプション Proxy (プロキシ) 環境下でcurl…

WordPressをAmazon S3 + CloudFront構成で月額200円で運用
システム全体の この構成のメリット・デメリット AWSの構成 静的ページを作成するWordPressプラグイン WP2Static WP Offload Media Lite WordPress on Docker環境 まとめ AmazonS…

inotify-tools rsync unison を利用してディレクトリを同期する
環境・バージョン情報等 inotify-tools バージョン情報 インストール inotifywait + rsync で同期する inotifywait + unison で同期する unisonの設定 同期コマンド 参考 inotify-tools…

fswatch rsync unison を使ってリアルタイムで同期する
環境・バージョン情報等 fswatch バージョン情報 インストール fswatch + rsync で同期する fswatch + unison で同期する unisonの設定 同期コマンド 参考 fswatch + rsync or fswatch…

最新の投稿

GitHub Actions で Gatsby をビルドし Amazon S3 にデプロイする
GitHub Actions について あらかじめ準備しておくもの AWS IAM ユーザを環境変数にセットする workflowの記述 ビルド バッジを利用する 終わりに 参考にしたところ Gatsbyで作った静的サイトを、GitHub Actions…

cloudinaryによる画像ファイルの管理 はじめてみる
目的 cloudinary について 他のサービスとの比較 料金プラン アカウントの登録 利用してみる ダッシュボード 画像の編集 APIベースでのアクセス 感想 参考 画像の管理や配信、さらには加工といった事ができるsaas型のcloud…

JavaScriptによる2分探索(バイナリサーチ) のサンプルコード
2分探索について ソース 参考 JavaScriptで2分探索(バイナリサーチ)を実装してみました。…

Vue.jsで作成された、ちょっと面白くて役立ちそうなサービス
UIコンポーネント VueSocial CKEditor 5 Vue.Draggable Vuetable 2 vuejs-datepicker Kalendar Vue Apexcharts Vue.js Google Charts vue-cart WebIDE…

GitHubのリポジトリをGitLabに同期する GitLabのミラーリング機能
GitLabのミラーリングについて GitHubのリポジトリをGitLabに反映する その他 参考 GitLabのミラーリング機能によりGitHubなどの外部のリポジトリとのミラーリングを行うことができます。 これを使ってGitHub…

WordPressやめます Gatsbyに移行しました
これまでのWordPress運用 なぜWordPressを捨てるのか? なぜGatsbyを利用するのか? gatsbyについて WordPressから記事の救出 移行対象記事の抽出 記事の置換 Gatsbyテーマの作成 Gatsby…

WordPressのDBから記事データを抽出する
WordPressのDB関連図 公開記事一覧の取得 タグ・カテゴリの取得 サムネイルの取得 おまけ: PHPスクリプト化しました 参考にしたところ WordPressにため込んだデータMarkdown化しGatsby…

ハイフンとかマイナスとかダッシュとか

Firebase + Nuxt で認証付きページを作るときに参考にしたいところ
Webアプリケーションのセッション管理にJWT導入を検討する際の考え方 Service Worker によるセッション管理 ユーザー セッションの管理 Nuxt.jsとFirebaseでSPA×SSR×PWA×サーバーレスを実現する CookieとセッションとJWT SSR…

GolangをCGIとして実行する
環境 golang パッケージ ソースと実行 ビルドとサーバ実行 標準ライブラリのみ Golang を CGIとして実行する際のメモ 環境 golang パッケージ 以下のモジュールを利用しています。 github.com/gorilla/mux…

Tags

Dates

© 2020   404 motivation not found