Terraform で作成された EC2 インスタンスに SSH 接続できない

Terraform で作成された EC2 インスタンスに SSH 接続できない

Ubuntu 18.04 で Terraform v1.0.11 を使用する

terraform apply以下の操作を行った後main.tf、インスタンスがチェックに合格するのを待機した後 (さらに 1 分)、SSH の試行が壁にぶつかります。

$ ssh -v -i ~/.ssh/toydeploy.pem [email protected]
OpenSSH_7.6p1 Ubuntu-4ubuntu0.5, OpenSSL 1.0.2n  7 Dec 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 18.144.125.224 [18.144.125.224] port 22.
debug1: connect to address 18.144.125.224 port 22: Connection timed out
ssh: connect to host 18.144.125.224 port 22: Connection timed out

同じ AMI とキー ペアを使用して手動でインスタンスを起動し、SSH で接続できるようになりました。コンソールでネットワークとセキュリティの設定を比較すると、手動でデプロイされたインスタンスがデフォルトの VPC を使用しており、「プライベート リソース DNS 名の応答」に手動でデプロイされたインスタンスの場合は「IPv4 (A)」、Terraformed の場合は「-」と表示されることだけが違いだとわかりました。どちらも問題ないように見えますが、間違っている可能性があります。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.27"
    }
  }
}

provider "aws" {
  profile = "default"
  region  = "us-west-1"
}

variable "cidr_vpc" {
  description = "CIDR block for VPC"
  default     = "10.1.0.0/16"
}

variable "cidr_subnet" {
  description = "CIDR block for subnet"
  default     = "10.1.0.0/20"
}

resource "aws_vpc" "toydeploy-vpc" {
  cidr_block           = var.cidr_vpc
  enable_dns_hostnames = true
  enable_dns_support   = true
}

resource "aws_subnet" "toydeploy-subnet" {
  vpc_id     = aws_vpc.toydeploy-vpc.id
  cidr_block = var.cidr_subnet
}

resource "aws_security_group" "toydeploy-sg" {
  name   = "toydeploy-sg"
  vpc_id = aws_vpc.toydeploy-vpc.id

  ingress {
    from_port = 22
    to_port   = 22
    protocol  = "tcp"
    cidr_blocks = [
      "0.0.0.0/0"
    ]
  }

  # Terraform removes the default rule, so we re-add it.
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_instance" "toydeploy" {
  ami                         = "ami-083f68207d3376798" # Ubuntu 18.04
  instance_type               = "t2.micro"
  security_groups             = ["${aws_security_group.toydeploy-sg.id}"]
  subnet_id                   = aws_subnet.toydeploy-subnet.id
  associate_public_ip_address = true
  key_name                    = "toydeploy"
}

以下に問題となるようなことが何もなく、実際に動作する例を教えていただけるとありがたいです。

解決済み

詳しく調べたところ、ルーティング テーブルはサブネットのみをルーティングしており、0.0.0.0/0 をルーティングしていないことがわかりました。以下を追加すると、問題は解決しました。

resource "aws_internet_gateway" "toydeploy-ig" {
  vpc_id = aws_vpc.toydeploy-vpc.id
}

resource "aws_route_table" "toydeploy-rt" {
  vpc_id = aws_vpc.toydeploy-vpc.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.toydeploy-ig.id
  }
}

resource "aws_route_table_association" "toydeploy-rta" {
  subnet_id      = aws_subnet.toydeploy-subnet.id
  route_table_id = aws_route_table.toydeploy-rt.id
}

答え1

接続がタイムアウトした場合は、通常、ネットワークの問題が考えられます。次の点を確認してください。

  • ポート 22 で IP に開かれているセキュリティ グループ / NACL
  • VPCにはインターネットゲートウェイがある
  • サブネットにはインターネットゲートウェイへのルートがある
  • インスタンスにはパブリックIPがある
  • ルーティングが正しく設定されている

これは接続試行のキーラインであり、何が起こっているかを示します

ssh: connect to host 18.144.125.224 port 22: Connection timed out

関連情報