こんにちは、CTO室のkazです!2019年もいろんなところで焚き火してチルアウトしていく所存です。よろしくお願いします。 タイトルが若干釣り気味ですが、awsebcliの仕様変更により既存設定ではeb ssh出来なくなって焦った...というお話です。
ENECHANGEではElasticBeanstalkで運用しているプロジェクトが多いのですが、サーバへログインする際はBastion経由で環境配下のサーバに接続するようにしています。
~.ssh/config
にはProxyCommandで任意のBastionを経由するよう下記のように記述して接続していました。
Host部はプライベートDNSを使用できるので汎用性があり、論理的に異なるNWのサーバに接続する際もHost部以外を変更して接続していました。
# Elastic-Beanstalk Host *.ap-northeast-1.compute.internal User ec2-user IdentityFile ~/.ssh/xxxxxx.pem ProxyCommand ssh -W %h:%p xxxxxx-bastion
ところが、eb sshしても全くサーバに到達出来ない事象に遭遇しました。timed out...
$ eb ssh INFO: Attempting to open port 22. INFO: SSH port 22 open. INFO: Running ssh -i /Users/kazumineigahara/.ssh/xxxxxx.pem ec2-user@172.36.xxx.xxx ssh: connect to host 172.36.xxx.xxx port 22: Operation timed out
debugで見てみました。なるほど...わからん!
$ eb ssh --debug 2019-01-22 17:34:09,415 (DEBUG) cement.core.foundation : laying cement for the 'eb' application 2019-01-22 17:34:09,415 (DEBUG) cement.core.hook : defining hook 'pre_setup' 2019-01-22 17:34:09,415 (DEBUG) cement.core.hook : defining hook 'post_setup' 2019-01-22 17:34:09,416 (DEBUG) cement.core.hook : defining hook 'pre_run' 2019-01-22 17:34:09,416 (DEBUG) cement.core.hook : defining hook 'post_run' (snip) INFO: SSH port 22 open. INFO: Running ssh -i /Users/kazumineigahara/.ssh/xxxxxxx.pem ec2-user@172.36.xxx.xxx ssh: connect to host 172.36.xxx.xxx port 22: Operation timed out 2019-01-22 17:35:26,514 (DEBUG) ebcli.operations.sshops : ssh returned exitcode: 255 2019-01-22 17:35:26,514 (DEBUG) ebcli.lib.aws : Making api call: (ec2, revoke_security_group_ingress) to region: ap-northeast-1 with args:{'GroupId': 'sg-xxxxxxxxxxxx', 'IpProtocol': 'tcp', 'ToPort': 22, 'FromPort': 22, 'CidrIp': '0.0.0.0/0'} 2019-01-22 17:35:26,814 (DEBUG) ebcli.lib.aws : API call finished, status = 200 2019-01-22 17:35:26,814 (DEBUG) ebcli.lib.aws : Response: {'ResponseMetadata': {'RequestId': '3431ce51-3813-4ef8-a422-3a819cd32545', 'HTTPStatusCode': 200, 'date': 'Tue, 22 Jan 2019 08:35:26 GMT', 'RetryAttempts': 0}} INFO: Closed port 22 on ec2 instance security group. 2019-01-22 17:35:26,820 (INFO) eb : Traceback (most recent call last): (snip)
NW周りも見直しましたが、ちっとも解決しないので、サポートに調査依頼したところ、下記返答がありました。
「当方にて awsebcli の実装を確認いたしましたところ、バージョン 3.14.7 にて、eb ssh を使用してプライベートサブネットのインスタンスにアクセスした場合、 プライベート DNS ではなくプライベート IP を使うように仕様が変更されておりました。」
報告を受けて下記のように~.ssh/config
のHost部にプライベートIPを指定する事ですんなりログインできるようになりました。
# Elastic-Beanstalk Host 172.36.* User ec2-user IdentityFile ~/.ssh/xxxxxx.pem ProxyCommand ssh -W %h:%p xxxxxx-bastion
プロジェクト毎にネットワークを分けてるので、IP書くの手間だなぁと思ってましたが、1時間後には慣れてました^^;
ちゃんとリリースノート読みましょうね。っていう反省です...!