【AWS Systems Manager】AWS CLIを用いてSSM経由でEC2インスタンスにアクセスしてみた


事前準備

本記事は、事前に以下設定がされていることを前提とします。
(a) IAMユーザーの設定(プログラムアクセスキー情報取得、MFA認証設定、各種IAMポリシー付与)
(b) AWS Systems Managerセッションマネージャーからの、EC2インスタンスへのセッション開始可能設定(別記事参照)
(c) ローカル環境にAWS CLIをインストール
(d) AWS CLI用のSession Manager Pluginをインストール

(a) IAMユーザーの設定

後述の手順で必要なため、IAMユーザーの概要画面で、以下設定がされたIAMユーザーのARNを控えること

AWSアカウントIDが「123456789012」で、IAMユーザー名が「ssm-user」の場合
arn:aws:iam::123456789012:user/ssm-user

(a-1) IAMユーザーの作成時に「プログラムによるアクセス」にチェックが入っていること

作成時に表示される「アクセスキーID」と「シークレットアクセスキー」を必ず控えること!!!

  • 特に「シークレットアクセスキー」はこのタイミングでしか参照できないため要注意
    • 万が一このタイミングで取得を逃した場合、以下手順でアクセスキーの再作成が必要

[IAM]->[アクセス管理]->[ユーザー]->[(対象ユーザー選択)]->[(概要画面から)認証情報]->「アクセスキーの作成」

  • 【参考_1】IAMユーザー作成画面
  • 【参考_2】アクセスキーの取得画面

(a-2) MFA認証が設定されていること

IAMユーザーがログインする際に、MFA認証ができるように設定をすること(説明割愛)

  • IAMユーザーに対するIAMポリシーアタッチ(MFA認証用途)や、スマホに「GoogleAuthenticator」等の認証アプリインストールが必要

(a-3) 本記事で取り上げるAWSサービス利用に必要なIAMポリシーが設定されていること

本来はもっと絞るべきですが、本記事では以下権限を付与しています。

  • AmazonEC2FullAccess
  • AmazonS3FullAccess
  • AmazonSSMFullAccess

(b) AWS Systems Managerセッションマネージャーからの、EC2インスタンスへのセッション開始可能設定

以下記事の内容を参考に、EC2の設定を実施する。後述の手順で必要になるため、作成したEC2インスタンスの「instance-id」を控えておく。

(c) ローカル環境にAWS CLIをインストール

以下公式サイトに従い、各環境に合わせてインストール

aws-cliのバージョン確認
$ aws --version
aws-cli/2.0.10 Python/3.7.4 Darwin/19.4.0 botocore/2.0.0dev14

(d) AWS CLI用のSession Manager Pluginをインストール

以下公式サイトに従い、各環境に合わせてインストール

手順

(1) ローカル環境のAWS CLIコンフィグ設定

ローカル環境にて「aws configure」コマンドを実行すると項目の入力を求められるため、事前準備(a)の情報をもとに入力し、AWS CLIコンフィグ設定を行う。

aws-cliのconfigure設定
$ aws configure
AWS Access Key ID [None]: (自身のIAMユーザーの「アクセスキーID」を入力)
AWS Secret Access Key [None]: (自身のIAMユーザーの「シークレットアクセスキー」を入力)
Default region name [None]: (自身のリージョンを入力、東京だったら「ap-northeast-1」を入力)
Default output format [None]: json
  • 「Default output format」はjson以外も選べるが、本記事ではjsonを選択
    • 【参考】Default output format
フォーマット 説明
json JSON形式で出力
yaml YAML形式で出力(AWS CLI ver.2から利用可能)
text 複数行のタブ区切り文字列値の形式で出力。grep、sed、awkなどで加工しやすい
table セルの罫線を形成する文字列(+
  • コンフィグ設定が完了すると、コンフィグ設定が書き込まれた以下ファイルが作成される。(Mac環境で実施した場合の状態のため、Windows環境などの場合は適宜フォルダパスを読み替えてください。)
aws-cliコンフィグファイル(Mac環境)
$ cat ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXX
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

$ cat ~/.aws/config
[default]
region = ap-northeast-1
output = json

(2) MFAを利用したAWS CLI経由でのAWSリソースアクセス認証

以下の情報を準備して、aws cliコマンドを実行してアクセス認証を行う。

  • 事前準備(a)で控えた、ARN情報から「user」を「mfa」に置換した文字列
    • 本記事のssm-userの例) arn:aws:iam::123456789012:mfa/ssm-user
  • MFA認証で使う6文字のコード
本記事のユーザー(ssm-user)で実行で認証する場合
$ aws sts get-session-token --serial-number arn:aws:iam::123456789012:mfa/ssm-user --token-code XXXXXX
{
    "Credentials": {
        “AccessKeyId”: "access-key-id",
        “SecretAccessKey”: "secret-access-key",
        “SessionToken”: "temporary-session-token",
        “Expiration”: "expiration-date-time"
    }
}

なお、認証情報の有効期限はデフォルトでは12時間となりますが、「--duration-seconds」オプションを使用することで、「900秒(15分)」から「129600秒(36時間)」まで変更可能です。ただし、rootユーザーの場合は「900秒(15分)」から「3600秒(1時間)」となります。

(3) AWS CLIコマンドからssm経由でセッションスタート

事前準備(b)で用意したEC2インスタンスの「instance-id」をターゲットに設定し、ssmプラグインをaws cliから実行してセッションを開始する。

$ aws ssm start-session --target i-xxxxxxxxxxxxxxxxxxx --region ap-northeast-1

Starting session with SessionId: xxxxxxxxxxxxxxxxxxxxxxxxxx
sh-4.2$

おまけ : MFA認証情報を、AWS CLIのプロファイル情報として利用する

認証情報が有効な間に限りますが、「credentials」ファイルにMFA情報として追記することで、AWS CLIコマンドの実行の際に「--profile」オプションの引数としてMFA認証プロファイルを利用することが可能となります。

[1] 手順(2)で取得した認証情報をcredentialsファイルに追記

ここで指定したプロファイル名(mfa)で、AWS CLIコマンドの引数として利用可能になる

~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXX
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[mfa]
aws_access_key_id = "access-key-id"
aws_secret_access_key = "secret-access-key"
aws_session_token = "temporary-session-token"

[2] 作成したプロファイル情報を指定してAWS CLIコマンドを実行

「--pforile」オプションで、[1]で作成したプロファイル名(mfa)を指定することで、実行可能となる。

$ aws ssm start-session --target i-xxxxxxxxxxxxxxxxxxx --region ap-northeast-1 --profile mfa

Starting session with SessionId: xxxxxxxxxxxxxxxxxxxxxxxxxx
sh-4.2$

参考URL