こんにちは、インフラエンジニア の 加藤(@kuromitsu_ka)です。
先日、自社のメディアサービス(STYLE HAUS)のElastiCache for RedisのEOL対応(2.x→6.xへアップグレード)を実施しました。
環境の説明と今回やったことの概要
STYLE HAUSの環境は、AWSに構築している本番環境とステージング環境、開発者のPC端末に構築しているテスト環境があります。
検証の段階で、PC端末に構築しているテスト環境(普段はlocalのRedisを使用している)から、ElastiCacheに接続して、バージョンアップの動作確認するため、今回、接続用の環境を構築しました。
※ こちらの記事も参考になると思います。
ざっくりやること
- ElastiCacheと通信可能なサブネットにEC2インスタンスを作成
- EC2インスタンスにてSSM Agentを起動(Amazon Linux2だとデフォルトでインストールされている)
- PC端末でSession Managerを実行
インフラの図
インフラ構成とIAM
EC2
- サブネット:ElastiCacheへ通信できるサブネットに作成
- AMI:Amazon Linux2を利用
- Amazon Linux2では、SSM Agentがデフォルトでインストール済み
- 参考:https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-setting-up.html
- インスタンスタイプ:t2.micro
EC2のインスタンスプロファイル
- 参考:https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-instance-profile.html
- 参考:https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-restrict-access-quickstart.html
実際にインスタンスプロファイルに付与したポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetDocument", "ssm:DescribeDocument", "ssm:StartSession", "ssm:TerminateSession" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2messages:AcknowledgeMessage", "ec2messages:DeleteMessage", "ec2messages:FailMessage", "ec2messages:GetEndpoint", "ec2messages:GetMessages", "ec2messages:SendReply" ], "Resource": "*" } ] }
開発端末のIAMユーザー
実際にIAMユーザーに付与したポリシー
{ "PolicyVersion": { "Document": { "Version": "2012-10-17", "Statement": [ { "Sid": "0", "Effect": "Allow", "Action": "ssm:StartSession", "Resource": [ "arn:aws:ec2:ap-northeast-1:xxx:instance/<EC2インスタンスのID>", "arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSessionToRemoteHost" ] } ] }, "VersionId": "v2", "IsDefaultVersion": true, "CreateDate": "2022-09-28T06:55:24+00:00" } }
作業者端末の手順
作業者のPC端末には、Session Manager プラグインのインストールと、上記のIAMユーザーの設定が必要でした。
Session Manager プラグインのインストール手順
セッション確立のコマンド
- --targetは、今回、SSM agentを起動させているEC2のid
- --parameters '{"host": で指定するElastiCacheのエンドポイントを、必要な接続先に変換する。
- localPortNumber は、端末や仮想マシンの空いているポートを使う。
セッション開始!! $ aws ssm start-session \ --target <EC2インスタンスのID>" \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ --parameters '{"host":["<ElastiCacheのエンドポイント>"], "portNumber":["6379"], "localPortNumber":["16379"]}' \ --profile <PC端末に設定したIAMユーザー> Starting session with SessionId: <IAMユーザー>_connection_by_SSM-052ccf2de6652c027 Port 16379 opened for sessionId <IAMユーザー>_connection_by_SSM-052ccf2de6652c027. Waiting for connections... Connection accepted for session
$ (sleep 1 | echo quit)|telnet localhost 16379 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK Connection closed by foreign host.
感想
今回の接続環境の作成方法を知らなかった時は、Nginxで多段プロキシーを用意する案も考えていましたが、今回の構成は、短時間且つ簡単に構築できてよかったです。本来の目的だった、EOL対応も、問題なく、完了できてよかったです。😢
株式会社エニグモ すべての求人一覧