【AWS】Session Manager経由でEC2インスタンスに接続する方法(画像付き解説)【2023年版】

EC2インスタンスにIAMロールを設定

作成済みのEC2インスタンスに、Session Manager経由で接続するためのポリシーを含むIAMロールを設定します。

IAMロールの作成

AWS Management Consoleにログインし、「IAM」サービスにアクセスします。

サイドメニューから「ロール」をクリックし、「ロールの作成」ボタンをクリックします。

「AWSのサービス」の「EC2」を選択し、「次へ」ボタンをクリックします。

AmazonSSMManagedInstanceCoreポリシーを選択し、「次へ」ボタンをクリックします。

ロール名および説明を入力し、「ロールを作成」ボタンをクリックします。

EC2インスタンスの設定

AWS Management Consoleにログインし、「EC2」サービスにアクセスします。

サイドメニューから「インスタンス」をクリックし、任意のEC2インスタンスを選択、「アクション」 > 「セキュリティ」 > 「IAMロールを変更」の順番にクリックします。

先ほど作成したIAMロールを選択し、「IAMロールの更新」ボタンをクリックします。

セキュリティグループの設定

Session Manager経由でEC2インスタンスに接続する場合、SSH (TCP/22) などのインバウンドルールは不要になるので削除します。

サイドメニューから「セキュリティグループ」をクリックし、任意のセキュリティグループを選択、「インバウンドルール」タブの中から「インバウンドのルールを編集」ボタンをクリックします。

SSH (TCP/22) などのインバウンドルールを削除し、「ルールを保存」ボタンをクリックします。

SSM Agentのインストール

EC2インスタンスにSSM Agentをインストールします。なお、Amazon Linux 2などの主要なAMIにはプリインストールされているのでインストールする必要はありません。

インストールが完了したら、以下のコマンドを実行してSSM Agentが起動しているか確認します。

$ sudo systemctl status amazon-ssm-agent
● amazon-ssm-agent.service - amazon-ssm-agent
   Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2023-02-12 08:03:54 UTC; 24min ago
 Main PID: 3087 (amazon-ssm-agen)
   CGroup: /system.slice/amazon-ssm-agent.service
           ├─3087 /usr/bin/amazon-ssm-agent
           ├─3153 /usr/bin/ssm-agent-worker
           └─3305 /usr/bin/ssm-session-worker SSM-06ad644cdfb4abd75

AWS CLIの設定 (オプション)

AWS CLIやSSH over Session ManagerでEC2インスタンスに接続する場合、以下の手順を行います。

AWS CLIのインストール

ローカルにAWS CLIをインストールします。

AWS CLIの設定

AWS CLIで使用するセキュリティ認証情報およびデフォルトのAWSリージョンを設定します。

AWS Management Consoleにログインし、「IAM」サービスにアクセスします。

サイドメニューから「ユーザー」をクリックし、任意のユーザーをクリックします。

「セキュリティ認証情報」タブの中から「アクセスキーを作成」ボタンをクリックします。

「コマンドラインインターフェイス (CLI)」を選択し、「上記のレコメンデーションを理解し〜」をチェックし「次へ」ボタンをクリックします。

「アクセスキーを作成」ボタンをクリックします。

「アクセスキー」および「シークレットアクセスキー」をコピーし、「完了」ボタンをクリックします(CSVファイルの保存は任意)。

ターミナルから以下のコマンドを実行し、AWS CLIの認証情報を設定します。

% aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: 

% aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************XXXX shared-credentials-file    
secret_key     ****************XXXX shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config

Session Managerプラグインのインストール

ローカルにSession Managerプラグインをインストールします。

% session-manager-plugin --version                    
1.2.398.0

EC2インスタンスへの接続方法

Session Manager経由でEC2インスタンスに接続する方法は3つあります。AWS CLIまたはSSH over Session Managerを使う場合、事前にAWS CLIの設定とSession Managerプラグインのインストールを行っておく必要があります。

AWS Management Console

セッションの開始

AWS Management Consoleにログインし、「Systems Manager」サービスにアクセスします。

サイドメニューの「セッションマネージャー」をクリックし、「セッションの開始」ボタンをクリックします。

任意のEC2インスタンスを選択し、「セッションを開始する」ボタンをクリックすると新しいタブでセッションが開始されます。

sh-4.2$ whoami
ssm-user

セッションの終了

セッションマネージャーから現在のセッション一覧が確認できます(後述のAWS CLIやSSH over Session Managerを使ったセッションも同様)。セッションを終了するには任意のセッションを選択し、「終了」ボタンをクリックします。

「終了」ボタンをクリックするとセッションを強制的に終了します。

AWS CLI

AWS CLIを使ってEC2インスタンスに接続するには以下のコマンドを実行します。

% aws ssm start-session --target i-XXXXXXXXXXXXXXXXX

i-XXXXXXXXXXXXXXXXXはEC2インスタンスのインスタンスIDです。AWS Management Consoleで確認するか、EC2インスタンスで以下のコマンドを実行して確認してください。

$ curl http://169.254.169.254/latest/meta-data/instance-id
i-XXXXXXXXXXXXXXXXX

SSH over Session Manager

SSH over Session Managerを使ってEC2インスタンスに接続するには、SSH設定ファイルを以下のように変更します。

% vi ~/.ssh/config
# SSH over Session Manager
host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

% ssh -i /path/to/keypair.pem ec2-user@i-XXXXXXXXXXXXXXXXX

特定の接続情報のみSSH over Session Managerで接続するには、SSH設定ファイルを以下のように変更します。

% vi ~/.ssh/config
Host my-ec2
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
  HostName i-XXXXXXXXXXXXXXXXX
  User ec2-user
  IdentityFile /path/to/keypair.pem

% ssh my-ec2

トラブルシューティング

アクセスが拒否される

AWS CLIまたはSSH over Session Managerを使ってEC2インスタンスに接続しようとしたときに、以下のエラーが表示される場合があります。

An error occurred (AccessDeniedException) when calling the StartSession operation: User: arn:aws:iam::XXXXXXXXXX:user/xxxxx is not authorized to perform: ssm:StartSession on resource: arn:aws:ec2:ap-northeast-1:XXXXXXXXX:instance/i-XXXXXXXXXXXX because no identity-based policy allows the ssm:StartSession action

原因はIAMユーザーまたはEC2インスタンスに必要な権限が付与されていないためです。

IAMユーザーに権限を付与

IAMユーザーにAmazonSSMFullAccessポリシーを付与します。より上位のAdministratorAccessなどのポリシーが付与されている場合は必要ありません。

EC2インスタンスに権限を付与

EC2インスタンスにIAMロールを設定」セクションを参照して、EC2インスタンスにAmazonSSMManagedInstanceCoreポリシーを付与します。

EC2インスタンスが見つからない

AWS CLIまたはSSH over Session Managerを使ってEC2インスタンスに接続しようとしたときに、以下のエラーが表示される場合があります。

An error occurred (TargetNotConnected) when calling the StartSession operation: i-XXXXXXXXXXXXXXX is not connected.

EC2インスタンスのインスタンスIDやAWSリージョン情報が間違っている可能性があります。インスタンスIDはAWS Management Consoleで確認するか、EC2インスタンスで以下のコマンドを実行して確認してください。

$ curl http://169.254.169.254/latest/meta-data/instance-id
i-XXXXXXXXXXXXXXXXX

EC2インスタンスのあるAWSリージョンを確認してください。コマンド実行時にオプションを指定しなければデフォルトのAWSリージョンが使用されます。デフォルトのAWSリージョンとは異なる場合、コマンド実行時にオプションを指定します。

% aws ssm start-session --target i-XXXXXXXXXXXXXXXXX --region ap-northeast-1
% aws configure list
...
    # デフォルトのAWSリージョン
    region                us-east-1      config-file    ~/.aws/config

関連記事

開発環境(ローカルストレージ)と本番環境(Amazon S3)にトリミング+リサイズした画像を保存する方法
# はじめに 以前、以下の記事を書きました。 - [開発環境と本番環境で画像のアップロード先を分岐する方法 \- AUTOVICE](https://www.autovice.jp/articles/68) - [ローカルやAmazon [...]
2020年3月7日 11:56
【Laravel】ローカルディスクやAmazon S3にアップロードした画像をビューで表示する方法
# はじめに 本記事では、ローカルディスクやAmazon S3にアップロードした画像をビューで表示する方法について説明しています。 なお、本記事では画像のアップロードする方法については説明していません。本記事は既に実装済みの画像アップロード [...]
2020年3月4日 15:44
【Laravel】Amazon S3へのアップロードが「403 Access Denied」で失敗する原因と対処方法
# はじめに LaravelでAmazon S3へ画像アップロードする処理を実装し、いざアップロードしようとしたところ、以下のエラーが出て失敗しました。 ``` Error executing "PutObject" on "https: [...]
2020年3月4日 13:33
開発環境と本番環境で画像のアップロード先を分岐する方法
# はじめに この記事では、以下の方針で画像のアップロード先を分岐する方法について解説しています。 - 開発環境:ローカル(storage/app/public/) - 本番環境:Amazon S3 # 事前準備 AWSに未登録の [...]
2020年3月4日 12:52
【Rails6】Action Textで挿入した画像の保存先をAmazon S3やGCSに変更する方法
# はじめに Rails 6.0で追加された「Action Text」で挿入した画像の保存先は、デフォルトではローカルディスク(Railsアプリの実行環境)となっています。 本記事では、Action Textで挿入した画像の保存先をローカル [...]
2019年12月8日 13:28
【AWS】awscliのインストール・初期設定の手順
はじめに AWSはWeb上に専用のコンソール画面が用意されていますが、操作によってはコンソール画面から行えないことがあります。 そんなときはAWSのコマンドラインツールである「awscli」を使うと便利です。 環境 • macOS Mojave [...]
2019年9月10日 0:56