PCからAWS Systems Manager 経由で SSH トンネルを使用してプライベート VPCのEC2へログイン

参考URL AWS Systems Manager 経由で SSH トンネルを使用してプライベート VPC リソースにアクセスしたいと考えています。どうすればよいですか?

前提条件

Windowsでjqコマンドをインストールしてコマンドプロンプトで使う方法。その他OSへのインストール方法まとめ。

事前準備 AWS SSOログインのURL (ex) https://d-XXXXXXXX.awsapps.com/start

AWS CLI 導入ガイド macOS での AWS CLI バージョン 2 のインストール、更新、アンインストール Windows での AWS CLI バージョン 2 のインストール、更新、アンインストール

Session Managerプラグイン導入ガイド (オプション) AWS CLI 用の Session Manager plugin をインストールする

SSO ユーザで ローカルPC AWS CLI 実行手順 (任意のTerminalSoftを使用ください。WindowsPowerShellまたは、Windows Terminalで使用可能です)

以下手順はWindows Treminal(PowerShell)の例となります。基本的にはMac、WSLのTerminalも同様です。

1. AWS シングルサインオン を使用するための AWS CLI の設定

# AWS SSO を使用するための名前付きプロファイルの設定

PS C:> aws --version
aws-cli/2.0.61 Python/3.7.7 Windows/10 exe/AMD64
PS C:> aws configure sso
SSO start URL [None]: https://d-95671852ef.awsapps.com/start
SSO Region [None]: ap-northeast-1
Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open or you wish to use a different device to authorize this request, open the following URL:

https://device.sso.ap-northeast-1.amazonaws.com/

Then enter the code:

XXXX-WWWW

There are 6 AWS accounts available to you.
                                       :
                                       :

SSO画面に登録されているAWSアカウントがリストされます。ログインしたいAWSアカウントを選択します。 f:id:hitoshi-shoji:20201204234623p:plain

ブラウザが起動し、「Sing into AWS CLI」ボタンをクリックします。 f:id:hitoshi-shoji:20201204234730p:plain

SSOログイン画面が表示されます。ログインします。

f:id:hitoshi-shoji:20201204234801p:plain

f:id:hitoshi-shoji:20201204234823p:plain

Treminalに戻ります。

## Profileを設定します。profile name は任意です。

Using the account ID 682167675618
The only role available to you is: AdministratorAccess
Using the role name "AdministratorAccess"
CLI default client Region [None]: ap-northeast-1
CLI default output format [None]: json
CLI profile name [AdministratorAccess-682167675618]: poc

To use this profile, specify the profile name using --profile, as shown:

aws s3 ls --profile poc
PS C:>

## AWS CLI 確認 (S3 backet 一覧表示)
PS C:> aws s3 ls --profile poc
2020-10-30 15:44:29 XXXXXX1
2020-09-10 11:22:23 XXXXXX2
2020-10-28 21:34:29 XXXXXX3
2020-11-02 21:52:42 XXXXXX4
2020-10-30 15:53:02 imageXXXXXXXX
2020-10-23 23:40:06 imageXXXXYYYY
2020-10-23 09:53:50 imageYYYYYYYY
2020-10-24 13:11:18 imageXXXXXXXX
2020-10-27 15:28:30 imageZZZZZZZZ
PS C:>

## ローカルPCでIAM権限に応じたAWS CLI(--profile 付与)を実行することが可能です。

   

2. SSMセッションマネージャー経由でのEC2ログイン手順

参考 ステップ 8: (オプション) Session Manager を通して SSH 接続を有効にする

  • SSOアカウントでAWS CLIログインした状態。
  • 事前にLinuxSSH秘密鍵(xxx.pem)をローカルPCに配置。

「.ssh/config」 の設定例

# SSH over Session Manager
host i-* mi-*
        ProxyCommand sh -c "aws ssm start-session --profile ${profile} --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

AWS CLIでEC2インスタンスのinstance-id取得

## Instance-ID 取得
$ aws ec2 describe-instances --profile poc | jq '.Reservations[].Instances[] | {InstanceId, InstanceName: (.Tags[] | select(.K
ey=="Name").Value)}'
            :
{
  "InstanceId": "i-015XXXXXXXXXXXX",
  "InstanceName": "CentOS"
}
            :
            
## インスタンス起動確認
$ aws ec2 describe-instance-status --instance-ids i-015XXXXXXXXXXXX --profile poc| jq '.InstanceStatuses[] | {InstanceId, In
stanceState: .InstanceState.Name, SystemStatus: .SystemStatus.Status, InstanceStatus: .InstanceStatus.Status}'
{
  "InstanceId": "i-015XXXXXXXXXXXX",
  "InstanceState": "running",
  "SystemStatus": "ok",
  "InstanceStatus": "ok"
}

EC2(CentOS7)へssh接続

$ export profile="poc"

ssh <user>@<instance-id> -i <秘密鍵>

$ ssh centos@i-015XXXXXXXXXXXX -i .ssh/aEC2.pem
Last login: Wed Nov  4 07:51:36 2020 from localhost
[centos@ip- ~]$
[centos@ip- ~]$ who
centos   pts/0        Nov  5 04:57 (localhost)

一般サイト SCP でファイル転送 ポートフォワードしてプライベートサブネットのRDS接続

(参考情報) AWS CLIインスタンス停止

## インスタンス停止
$ aws ec2 stop-instances --profile poc --instance-ids i-015b2XXXXXXXXXX
{
    "StoppingInstances": [
        {
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "InstanceId": "i-015b2XXXXXXXXXXX",
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}

## 停止確認
$ aws ec2 describe-instances --profile poc --instance-ids i-015b2XXXXXXXXXX | jq '.Reservations[].Instances[] | {InstanceId,
 InstanceState: .State.Name}'
{
  "InstanceId": "i-015b2XXXXXXXXXXXXX",
  "InstanceState": "stopped"
}

一般サイト 【Tips】AWS CLIを使ってAmazon EC2を起動・停止するワンライナーまとめ