初学者向け：Tera Termを使って、EC2インスタンスに.pemファイルを使いSSH接続する方法

## はじめに
この記事では、Windows環境で利用できるTera Termを使用し、AWS環境のEC2インスタンスにSSH接続して簡単な操作を行う手順を解説します。

:::note warn
***特に、.pemファイルを用いたSSH接続の方法に焦点を当てます。***
:::

今回のAWSインフラ環境の構築には、IaC（Infrastructure as Code）の代表的なツールである***Terraform***を使用しています。

:::note alert
***「Tera Term」と「Terraform」という、似た名前のツールが登場しますが、混乱しないようご注意ください！***
:::

（余談ですが、CloudFormationを使うべきだったかもしれません…笑）

## Tera Termとは
Tera Term（テラターム）は、Windowsユーザー向けの端末エミュレーターです。

![スクリーンショット 2024-12-15 0.32.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/113b1341-dba8-9a48-a792-ed90c699168b.png)

引用画像：https://www.miraiserver.ne.jp/column/about_ssh/

SSH（Secure Shell）を利用して、リモートサーバーに安全に接続する際に広く使われています。

https://qiita.com/free-honda/items/96a28eb26c02e596f908

:::note
***基本的なTera Termの使い方については、上記の記事で詳しく解説していますので、必要に応じて参考にしてください。***
:::

## pemファイル（秘密鍵）とは

.pemファイルは、AWS EC2インスタンスにSSH接続する際に使用する秘密鍵ファイルです。

![スクリーンショット 2024-12-15 9.24.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5903b027-78a8-9647-f1a6-fd937d1b99c4.png)
引用画像：https://zenn.dev/goldsaya/articles/39877e2cf11d4e

このファイルはインスタンス作成時に生成され、安全な接続を保証するために非常に重要な役割を果たします。

詳しい解説は、以下の記事が参考になりましたので、ご紹介いたします。

https://www.netattest.com/pem-2024_mkt_tst

EC2インスタンスを作成する際に生成され、インスタンスへの安全な接続を保証します。

:::note alert
**【注意事項】**
**.pemファイルは非常に重要なファイルです。**
- ***紛失するとインスタンスにアクセスできなくなる恐れがあります。***
- ***AWSからダウンロードした秘密鍵は適切に保管し、第三者に絶対に共有しないでください。***
- ***ローカル環境で使用する際は、ファイル権限を厳しく制限（例: 400に設定）することを推奨します！***
:::

***何度も繰り返しますが、このファイルは極めて重要です。取り扱いや保管には十分注意してください！***

## 前提条件
この記事では、以下の条件を前提として進めます。

:::note
- **EC2インスタンスが構築済みであること**
過去の記事でシングルAZ構成として構築したEC2インスタンスを使用します。

- **インスタンスの配置場所**
EC2インスタンスはパブリックサブネットに配置され、直接SSH接続が可能な状態になっています。

- **.pemファイル（秘密鍵）が手元にあること**
EC2インスタンス作成時にダウンロードした.pemファイルを使用します。このファイルがない場合はインスタンスに接続できません。

- **接続先ユーザー**
接続先のデフォルトユーザー名は「```ec2-user```」を想定しています。
:::

***AWSのインフラ環境については、この後、コードを使用してスマートに構築していきます！！***

https://qiita.com/free-honda/items/7770f57db0b9e619cfb4

また、Tera Termのインストール方法については、過去の記事をご参照ください。

https://qiita.com/free-honda/items/96a28eb26c02e596f908

## インフラ環境構築

AWSのインフラ環境構築は、シンプルなシングルAZ構成をTerraformを使って作成しています。

:::note warn
***補足として、以下のコードを流用する際には、事前に.pemファイルを作成しておく必要があります。***
:::

```main.tf
provider "aws" {
  region = "ap-northeast-1" # Tokyo region
}

# VPC作成
resource "aws_vpc" "main_vpc" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "terraform-main-vpc"
  }
}

# サブネット作成 (パブリックサブネット)
resource "aws_subnet" "public_subnet" {
  vpc_id                  = aws_vpc.main_vpc.id
  cidr_block              = "10.0.1.0/24"
  map_public_ip_on_launch = true

  tags = {
    Name = "terraform-public-subnet"
  }
}

# インターネットゲートウェイ作成
resource "aws_internet_gateway" "main_igw" {
  vpc_id = aws_vpc.main_vpc.id

  tags = {
    Name = "terraform-main-igw"
  }
}

# ルートテーブル作成
resource "aws_route_table" "public_route_table" {
  vpc_id = aws_vpc.main_vpc.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.main_igw.id
  }

  tags = {
    Name = "terraform-public-route-table"
  }
}

# サブネットとルートテーブルの関連付け
resource "aws_route_table_association" "public_association" {
  subnet_id      = aws_subnet.public_subnet.id
  route_table_id = aws_route_table.public_route_table.id
}

# セキュリティグループ作成
resource "aws_security_group" "public_sg" {
  vpc_id = aws_vpc.main_vpc.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # HTTPアクセスを許可
  }

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # SSHアクセスを許可
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"] # すべてのアウトバウンドを許可
  }

  tags = {
    Name = "terraform-public-sg"
  }
}

# EC2インスタンス作成
resource "aws_instance" "apache_ec2" {
  ami                         = "ami-0b6fe957a0eb4c1b9" # Amazon Linux 2 AMI (Tokyo region)
  instance_type               = "t2.micro"
  subnet_id                   = aws_subnet.public_subnet.id
  security_groups             = [aws_security_group.public_sg.id] # 修正: IDを参照
  associate_public_ip_address = true # パブリックIPv4アドレスを有効化
  key_name                    = "honda" # 修正: キーペア名を指定

  user_data = <<-EOF
    #!/bin/bash
    yum update -y
    yum install -y httpd
    systemctl start httpd
    systemctl enable httpd
    echo "<html><body><h1>Welcome to Apache Server powered by Terraform!</h1></body></html>" > /var/www/html/index.html
  EOF

  depends_on = [aws_security_group.public_sg] # 修正: セキュリティグループに依存

  tags = {
    Name = "terraform-apache-ec2"
  }
}
```

過去の記事のTerraformコードを流用し、一部キーペア名を指定して追加しています。

https://qiita.com/free-honda/items/7770f57db0b9e619cfb4

## EC2インスタンスにSSH接続してみた

まず、上記のコードで作成したEC2インスタンスのパブリックIPアドレスを確認します（例: ```43.207.168.228```）。

![スクリーンショット 2024-12-15 8.42.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/d12fba89-faa6-7ec6-ee1e-86b62c4499a6.png)

Tera Termを起動すると、接続画面が表示されます。ここで「ホスト」欄に、先ほど確認したパブリックIPアドレスを入力します。

![スクリーンショット 2024-12-15 9.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/561bff09-be16-1e7a-b81f-608e3fa109a2.png)

初回接続時に表示される確認画面が出た場合、そのまま「続行」をクリックして進んでください。

![スクリーンショット 2024-12-15 8.51.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e9273da3-389e-2f07-41f9-7c187acc861c.png)

次に、接続画面で「OK」を押すと、SSH認証のウィンドウが表示されます。ここで、ユーザー名として「ec2-user」を入力します。

![スクリーンショット 2024-12-15 8.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1f4d5274-ef1d-eb3a-ef49-a23f7429194d.png)

***「RSA/DSA/ECDSA/ED25519 鍵を使用する」にチェックを入れ、.pemファイルを指定します。***

「OK」をクリックすると、接続が開始されます。接続が成功すれば、Tera Termのウィンドウ上にリモートサーバーのコマンドラインが表示されます。

![スクリーンショット 2024-12-15 8.55.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/16e341ce-5e6e-9603-8aab-465c964acb83.png)

## コマンドを使い、Hello worldしてみた

SSH接続が完了したら、以下のコマンドを実行して「Hello world」を表示します。

```bash
echo "Hello world"
```

実行後、次のように表示されれば、今回の技術検証は完了です。

![スクリーンショット 2024-12-15 8.57.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5bfb9afa-b6d1-6f57-5d78-3e0150a3f03c.png)

## まとめ
ここまでお読みいただき、ありがとうございました！予想以上にTerraformのコード化部分でエラーが発生し、少し時間がかかってしまいました（笑）。

:::note warn
***今回は、主にWindowsユーザー向けの内容でしたが、サーバーへのSSH接続はサーバー構築や管理における第一歩です。***
:::

この記事が、SSH接続の基本やTera Termの使い方を理解する手助けとなれば幸いです！

## おまけ：Macユーザーの場合のSSH接続について

Macではターミナルを使用して、```ssh``` コマンドで簡単にEC2インスタンスへ接続できます。以下に基本的な手順を示します。

:::note
***ターミナルを開き、秘密鍵（.pemファイル）が保存されているディレクトリに移動します。***
:::

必要に応じて、次のコマンドでファイルの権限を変更します。

```bash
chmod 400 your-key.pem
```

次のコマンドを実行して接続することで、GUIは不要で、シンプルに操作できます。

```bash
ssh -i your-key.pem ec2-user@インスタンスのパブリックIPアドレス
```

## 関連記事

https://dev.classmethod.jp/articles/aws-beginner-ec2-ssh/

https://qiita.com/Aichi_Lover/items/3471b1ba710e995ffd80

https://zenn.dev/ndjndj/articles/dda0ccae5d44e3