AWS-Systems-Manager

AWS SSMでプライベートなEC2インスタンスにSSH接続して、アップロードした自作ローカルリポジトリからミドルウェアをインストールしてみた

はじめに

こんにちは、omkです。
今回はプライベートなVPC内にあるEC2インスタンスでミドルウェアのインストールを行いました。

通常ではプライベートなインスタンスには直接接続できない上に、標準のリポジトリではインターネットを通さずにパッケージをインストールできません。

そこで、AWS Systems Manager(SSM)を用います。

SSMを使うことでSSMエージェントのインストールされたEC2インスタンスを管理することが出来ます(VPCエンドポイントを用いるとインターネットに接続する必要はありません)。

この中のセッションマネージャーの機能を使い、自作したローカルリポジトリをアップロードして用いることで、プライベートなインスタンスでのパッケージのインストールを実現します。

今回は試しにCentOS7のインスタンスにphp5.4.16をインストールします(パッチマネージャーやディストリビューターは使わず、SCPでアップし、SSHで接続してサーバ内部でyumを用います)。

長くなりましたが、要するにEC2インスタンスをインターネットに接続せずにyumでパッケージインストールするというお話です。


前提

リポジトリの作成

インターネットに接続されたマシンでリポジトリを作っていきます。

まずはディレクトリの作成と移動です。このディレクトリにパッケージをダウンロードします。

$ mkdir myphprepo
$ cd myphprepo

依存関係を考慮してphpのパッケージをダウンロードします。
repotrackコマンドはyum-utilsをインストールすることで使用可能になります。

$ sudo yum install yum-utils
$ repotrack php

createrepoコマンドをインストールします。
このコマンドで先ほどダウンロードしたパッケージからリポジトリを作成します。

$ cd ../
$ sudo yum install createrepo
$ createrepo  --simple-md-filenames myphprepo

転送用にアーカイブ化+圧縮します。

$ tar cvfz myphprepo.tar.gz myphprepo

リポジトリの転送・設定・インストール

windows PowerShellでAWS CLIを用いて接続します。
CLIのインストールやクレデンシャルの登録はすでに済ませていますので割愛します。

IAMロールでSSHを有効化

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ssm:StartSession",
            "Resource": [
                "arn:aws:ec2:*:*:instance/{instance-id}",
                "arn:aws:ssm:*:*:document/AWS-StartSSHSession"
            ]
        }
    ]
}

AWS CLIで転送・接続

プロキシコマンドを設定します(以下Windows用)。
SSHの設定ファイルに以下をコピペします(多分ここ→C:\Users\ユーザー名.ssh\config)。

# SSH over Session Manager
  host i-* mi-*
      ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"

scpコマンドでリポジトリファイルを転送します。

> scp -i {鍵のパス} {リポジトリファイルのパス} {username}@i-{*********}:~/
myphprepo.tar.gz                                                                      100%  110MB 645.2KB/s   02:55

アップロードできました。

sshコマンドで接続します。

> ssh -i {鍵のパス} {username}@i-{*********}

ログイン出来たらリポジトリのファイルがあることを確認します。

$ ls
myphprepo.tar.gz

リポジトリの設定

リポジトリのファイルを解凍して適当なディレクトリに置きます。
今回は/tmp/myphprepoにします。

/etc/yum.repos.d/に設定ファイル作成

$ sudo vi /etc/yum.repos.d/myphprepo.repo

 [myphprepo]
enabled=1
gpgcheck=1
name=myphprepo
baseurl=file:///tmp/myphprepo

ついでにエラーの原因になるので他のリポジトリをenable=0にしておきました(いづれにせよインターネットに繋がらないので使えない)。

リポジトリを更新します。

$ yum clean all --verbose

リポジトリが追加されていることを確認します。

$ yum repolist all

myphprepo            myphprepo              enabled: 183

追加されているのでリポジトリを指定してPHPをインストール

$ sudo yum --enablerepo=myphprepo install php 
---略---

$ php -v
PHP 5.4.16 (cli) (built: Apr  1 2020 04:07:17)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

インストールできました。

まとめ

特殊なケースとして、こういった使い方もできなくはないようです。
SSMの他の機能の利便性を考えるとインターネットに接続できる状態での運用が望ましいとは思いますが。

参考

https://usado.jp/spdsk/2018/01/22/post-3074/
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html
https://dev.classmethod.jp/articles/session-manager-launches-tunneling-support-for-ssh-and-scp/
https://itbasesta.com/local-repository
https://eng-entrance.com/linux-package-local

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA