はじめに
AWS Systems Manager Session Managerを使用すると、SSHキーを管理することなくEC2インスタンスにログインできます。
個人的な勉強でEC2インスタンスを使用するとき、毎回SSHキーの設定をしていました。
しかし今回はEC2インスタンスをpublicサブネットに配置し、Session Managerでアクセスできる状態をTerraformで作成してみます。
課題
- EC2インスタンスにSSHするために以下の手順が発生
- SSHキーを作成
- キーのダウンロード
- ssh agentに鍵を登録
- 踏み台サーバとして利用するときは、グローバルIPに合わせてセキュリティグループのインバウンドルールを修正しなければいけない
目標
この記事ではゴールを以下に設定します。
- AWSマネジメントコンソールからEC2インスタンスへセッションを開始できる
- ローカルPCから
aws ssm session-start
コマンドを実行できるようにする
前提
- ローカルでterraformコマンドを実行できる
- ローカルでaws cliを実行できる
~/.aws/credentials
にAWSアクセスキーを設定している
バージョン
ツール | バージョン |
---|
terraform | v1.4.6 |
aws cli | aws-cli/2.9.19 |
準備
環境変数
環境変数をエクスポートします。
筆者はdirenvを使っているため.env
ファイルを定義します。
AWS_PROFILE
の値は、~/.aws/credentials
に合わせて設定してください。
使用するTerraformのバージョンは2023年5月現在最新の1.4.6を使用します。
aws providerのバージョンも2023年5月現在、最新のバージョンにします。
tfstateはあくまで勉強用なのでs3ではなくローカルに置くことにします。
terraform initを実行してみます。
とりあえず準備は完了しました。この段階でmain.tfには何も書いていませんが、ここまで以下のようなディレクトリ構成になっています。
ネットワークを整える
まずはVPC周辺のリソースを先に作成します。
EC2インスタンスのAMIを探す
仕事ではAmazon Linux2を使用していますが、勉強目的なので今回はAmazon Linux 2023を使用します。
Amazon Linux 2023 (AL2023) のAMIにはすでに AWS System Managerエージェント(SSM Agent)がインストールされています。
参考:
ネット上に存在するAmazon Linux 2023の記事やamazonlinux/amazon-linux-2023 - GitHubをみると、AMI名はal2023-ami-xxxxx
になっていることが確認できます。
Terraformだとdata sourcesを使うことでAMI IDを確認できます。
terraform plan
aws cliからAMI IDを探す
Systems Manager を使用して最新の Amazon Linux AMI を検索するにはaws cliにあるaws ssm get-parameters-by-pathコマンドを実行すると取得できます。
aws ssm get-parameters-by-path
EC2インスタンスを作成する
ドキュメントによるとAmazonSSMManagedInstanceCore
ポリシーを持ったロールをアタッチする必要があるそうです。
Session Manager に必要な基本許可を持つインスタンスプロファイルがすでにAmazon EC2インスタンスに添付されている可能性があります。AWS 管理ポリシー AmazonSSMManagedInstanceCore を含むインスタンスプロファイルが既にインスタンスにアタッチされている場合、Session Manager に必要なアクセス許可は既に付与されています。
引用:ステップ 2: Session Manager 許可を持つ IAM ロールを確認または作成する
TerraformでIAMロール、インスタンスプロファイル、EC2インスタンスを作成します。
コードは先ほどの続きで、main.tf に追記します。
terraform plan、terraform applyコマンドを実行するとEC2インスタンスの作成できます。
接続
AWSマネジメントコンソールからアクセスする
早速 EC2のページからインスタンスを選択して接続
ボタンをクリックしてみます。
publicサブネットに配置した EC2インスタンスは接続ボタンが押せるようになっています!
ボタンをクリックするとAWSマネジメントコンソールからセッションを開始することができました!
これで1つ目の目標 “AWSマネジメントコンソールからEC2インスタンスへセッションを開始できる” が完了しました。
ターミナルからセッションを開始する
aws ssm start-session
コマンドでセッションを開始するには、Session Manegerプラグインをインストール必要があります。
参考:AWS CLI 用の Session Manager プラグインをインストールする
無事にセッションをスタートさせることができました。
これで2つ目の目標 “ローカルPCからaws ssm session-start
コマンドを実行できるようにする” が完了しました。
さいごに
今回はpublicサブネットに EC2インスタンスを配置しました。
しかし、実際の運用ではprivateサブネットに置くことの方が多いと思います。
次回はprivateサブネットに配置した EC2インスタンスにアクセスできるようにしてみようと思います。
使ったコードは blog-code/2023/05/aws-ssm-public に置いています。