【5分でわかる】terraformでElastic Beanstalk環境を作るときにパブリックでSSHを公開しないようにする方法

アドベントカレンダー6日目です！

今日はちょっと短い記事で。

## 背景と問題

最近、Elastic Beanstalk環境をリハ用に構築する機会がありました。
みなさんも経験あると思うんですが、リハを何回かやるのでElastic Beanstalk環境を何回も構築する必要があって、**そのたびにWebコンソールからポチポチやるの大変ですよね？** 手作業なので**オペミスが発生したらリハの意味がない**ですし。

なので、そこをterraformでできないかと試していましたところ、デフォルトではElastic Beanstalk環境のEC2インスタンスの**SSHポート（ポート22）が0.0.0.0で公開されてしまう**という問題に当たりました。

手で直すのも良いのですが、やっぱりそこはエンジニアなので自動でできないかなといろいろ試行錯誤して、ワークアラウンドを見つけたので記事にします。

:::note warn
※ワークアラウンドなので、もし、恒久的な解決策を知っている方がいたらぜひ教えて下さい

:::

## 達成できたこと
SSH接続元を限定し、Elastic Beanstalk環境のEC2インスタンス自身（127.0.0.1/32）からのポート22へのSSH接続のみを許すということで、アクセス制限することができました。
なのですが、**ポートを完全に閉じることはできませんでした**。（なので、SGにはルールが残っている状態です）

## コード
以下のコードのように`SSHSourceRestriction`を指定することで、Elastic Beanstalk環境のEC2インスタンス自身（127.0.0.1/32）からのポート22へのSSH接続のみを許すようになります。

```terraform:main.tf
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してみると入れることが確認できました！

```bash: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）からのみ許可されていることも確認できます！

## ドキュメント
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-options-general.html#:~:text=SSHSourceRestriction

## 最後に
今回はterraformでElastic Beanstalk環境を作るときに**パブリックでSSHを公開しない**ようにする方法を解説しました。
この記事がどなたかのお役にたてれば幸いです。

## 宣伝
「**沖縄で、業務時間中にQiita書いても怒られない会社で働いてみたくないですか？あ、もちろん沖縄じゃなくてフルリモートも可能です**」

僕の勤務するちゅらデータでは一緒に「**最高に面白い仕事を沖縄に創る**」仲間を募集しております。（特に、[幅広い分野の Web アプリケーションの提案・要件定義・設計・実装・運用をおまかせできるWebエンジニア（ミドル）を募集](https://churadata.okinawa/jobs/application-engineer-m/)しております。）

「**技術力の高い会社、仲間**と一緒に働きたい！」
「**おもしろい**と思える仕事がしたい！！」
「**フルリモート**で働きたい！」or「**沖縄**で働きたい！」
「おいおい、なんだこの記事は？**terraformっていうのはなぁ、こうやって使うんだよ！！**」

というそんなあなた、**ちゅらデータにピッタリ**です。ぜひ↓からご応募くださいませ。
（ちょっと話を聞いてみたいという方もけっこういらっしゃって、**30分だけ話を聞いてみるというカジュアル面談**もやっていますので、ご希望の方はお気軽にコメント、TwitterからDMなどくださいませ）

https://churadata.okinawa/jobs/application-engineer-m/