はじめに
こんにちは、omkです。
今回はプライベートなVPC内にあるEC2インスタンスでミドルウェアのインストールを行いました。
通常ではプライベートなインスタンスには直接接続できない上に、標準のリポジトリではインターネットを通さずにパッケージをインストールできません。
そこで、AWS Systems Manager(SSM)を用います。
SSMを使うことでSSMエージェントのインストールされたEC2インスタンスを管理することが出来ます(VPCエンドポイントを用いるとインターネットに接続する必要はありません)。
この中のセッションマネージャーの機能を使い、自作したローカルリポジトリをアップロードして用いることで、プライベートなインスタンスでのパッケージのインストールを実現します。
今回は試しにCentOS7のインスタンスにphp5.4.16をインストールします(パッチマネージャーやディストリビューターは使わず、SCPでアップし、SSHで接続してサーバ内部でyumを用います)。
長くなりましたが、要するにEC2インスタンスをインターネットに接続せずにyumでパッケージインストールするというお話です。
前提
- EC2インスタンスにはSSMのエージェントがインストールされている(ここだけはゲートウェイを置いて行いました)
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html - EC2とSSMはVPCエンドポイントで繋がっている
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-systems-manager-vpc-endpoints/ - AWS CLIを使う
リポジトリの作成
インターネットに接続されたマシンでリポジトリを作っていきます。
まずはディレクトリの作成と移動です。このディレクトリにパッケージをダウンロードします。
$ 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
ピカピカの1年目、omkです!
LINK
クラウドベリージャム:プロフィールページ