(VPNのない環境の)ElastiCacheにPC端末からアクセスするのに必要なインフラと手順

こんにちは、インフラエンジニア の 加藤(@kuromitsu_ka)です。

先日、自社のメディアサービス(STYLE HAUS)のElastiCache for RedisのEOL対応(2.x→6.xへアップグレード)を実施しました。

環境の説明と今回やったことの概要

STYLE HAUSの環境は、AWSに構築している本番環境とステージング環境、開発者のPC端末に構築しているテスト環境があります。

検証の段階で、PC端末に構築しているテスト環境(普段はlocalのRedisを使用している)から、ElastiCacheに接続して、バージョンアップの動作確認するため、今回、接続用の環境を構築しました。

※ こちらの記事も参考になると思います。

aws.amazon.com

ざっくりやること

  • ElastiCacheと通信可能なサブネットにEC2インスタンスを作成
  • EC2インスタンスにてSSM Agentを起動(Amazon Linux2だとデフォルトでインストールされている)
  • PC端末でSession Managerを実行

インフラの図

インフラ構成とIAM

EC2

EC2のインスタンスプロファイル

実際にインスタンスプロファイルに付与したポリシー

{
    "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ユーザーの設定が必要でした。

セッション開始!!
$ 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
  • telnet動作確認
    • aws ssm start-sessionのlocalPortNumberで指定した、localhostのポートがElastiCacheと繋がっている。
$ (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対応も、問題なく、完了できてよかったです。😢

株式会社エニグモ すべての求人一覧

hrmos.co