アドベントカレンダー6日目です!
今日はちょっと短い記事で。
背景と問題
最近、Elastic Beanstalk環境をリハ用に構築する機会がありました。
みなさんも経験あると思うんですが、リハを何回かやるのでElastic Beanstalk環境を何回も構築する必要があって、そのたびにWebコンソールからポチポチやるの大変ですよね? 手作業なのでオペミスが発生したらリハの意味がないですし。
なので、そこをterraformでできないかと試していましたところ、デフォルトではElastic Beanstalk環境のEC2インスタンスのSSHポート(ポート22)が0.0.0.0で公開されてしまうという問題に当たりました。
手で直すのも良いのですが、やっぱりそこはエンジニアなので自動でできないかなといろいろ試行錯誤して、ワークアラウンドを見つけたので記事にします。
※ワークアラウンドなので、もし、恒久的な解決策を知っている方がいたらぜひ教えて下さい
達成できたこと
SSH接続元を限定し、Elastic Beanstalk環境のEC2インスタンス自身(127.0.0.1/32)からのポート22へのSSH接続のみを許すということで、アクセス制限することができました。
なのですが、ポートを完全に閉じることはできませんでした。(なので、SGにはルールが残っている状態です)
コード
以下のコードのようにSSHSourceRestriction
を指定することで、Elastic Beanstalk環境のEC2インスタンス自身(127.0.0.1/32)からのポート22へのSSH接続のみを許すようになります。
resource "aws_elastic_beanstalk_environment" "hagiwara-test-environment" {
# 省略
setting {
name = "SSHSourceRestriction"
namespace = "aws:autoscaling:launchconfiguration"
resource = ""
# 補足:検証していないがドキュメント(後述)によると「22,22」には「22,1024」などのようにポート範囲を指定できる。
# 今回は22番ポートしか使わないので「22,22」と指定。
value = "tcp,22,22,127.0.0.1/32"
}
# 省略
検証
実際にElastic Beanstalk環境のEC2インスタンス上からsshしてみると入れることが確認できました!
# まずはElastic Beanstalk環境のEC2インスタンスに入る。
# このコマンドの前にSSHエージェントに秘密鍵を登録しておくことが必要。
$ eb ssh -e "ssh -A" --force
INFO: Attempting to open port 22.
INFO: SSH port 22 open.
INFO: Running ssh -A ec2-user@35.77.48.185
_____ _ _ _ ____ _ _ _
| ____| | __ ___| |_(_) ___| __ ) ___ __ _ _ __ ___| |_ __ _| | | __
| _| | |/ _ \/ __| __| |/ __| _ \ / _ \/ _\ | _ \/ __| __/ _\ | | |/ /
| |___| | (_| \__ \ |_| | (__| |_) | __/ (_| | | | \__ \ || (_| | | <
|_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\
Amazon Linux 2 AMI
This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
WILL BE LOST if the instance is replaced by auto-scaling. For more information
on customizing your Elastic Beanstalk environment, see our documentation here:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
# sshできたので、Elastic Beanstalk環境のEC2インスタンス上から再度sshできるか試してみる
[ec2-user@ip-172-31-3-248 ~]$ ssh ec2-user@localhost
_____ _ _ _ ____ _ _ _
| ____| | __ ___| |_(_) ___| __ ) ___ __ _ _ __ ___| |_ __ _| | | __
| _| | |/ _ \/ __| __| |/ __| _ \ / _ \/ _\ | _ \/ __| __/ _\ | | |/ /
| |___| | (_| \__ \ |_| | (__| |_) | __/ (_| | | | \__ \ || (_| | | <
|_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\
Amazon Linux 2 AMI
This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
WILL BE LOST if the instance is replaced by auto-scaling. For more information
on customizing your Elastic Beanstalk environment, see our documentation here:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
# プロンプトが出たのでsshできたことが確認できる
[ec2-user@ip-172-31-3-248 ~]$
また、EC2インスタンスのSecurity Groupを確認することでSSH通信がローカル(127.0.0.1/32)からのみ許可されていることも確認できます!
ドキュメント
最後に
今回はterraformでElastic Beanstalk環境を作るときにパブリックでSSHを公開しないようにする方法を解説しました。
この記事がどなたかのお役にたてれば幸いです。
宣伝
「沖縄で、業務時間中にQiita書いても怒られない会社で働いてみたくないですか?あ、もちろん沖縄じゃなくてフルリモートも可能です」
僕の勤務するちゅらデータでは一緒に「最高に面白い仕事を沖縄に創る」仲間を募集しております。(特に、幅広い分野の Web アプリケーションの提案・要件定義・設計・実装・運用をおまかせできるWebエンジニア(ミドル)を募集しております。)
「技術力の高い会社、仲間と一緒に働きたい!」
「おもしろいと思える仕事がしたい!!」
「フルリモートで働きたい!」or「沖縄で働きたい!」
「おいおい、なんだこの記事は?terraformっていうのはなぁ、こうやって使うんだよ!!」
というそんなあなた、ちゅらデータにピッタリです。ぜひ↓からご応募くださいませ。
(ちょっと話を聞いてみたいという方もけっこういらっしゃって、30分だけ話を聞いてみるというカジュアル面談もやっていますので、ご希望の方はお気軽にコメント、TwitterからDMなどくださいませ)