概要
過去にterraformによりAWSのec2インスタンスを作成した
しかし、これではssh接続の際のキーペアが設定されていないため、terraformでec2にキーペアを設定する方法をまとめる
terraformのためには認証キーの登録が必要なため別途以下で対応
キーペアなしでEC2インスタンスを構築
EC2を起動する
EC2をterraformで起動するための最低限のスクリプトは以下の通り
リージョンとAMI, インスタンスタイプをmain.tf
に記載する
今回はAmazon Linuxを使用
main.tf
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_instance" "default" {
ami = "ami-09ebacdc178ae23b7" # Amazon Linux 2 AMI (HVM), SSD Volume Type(64 ビット x86)
instance_type = "t2.micro"
}
$ ls
main.tf
# 初回のみ実行
$ terraform init
# 内容確認
$ terraform plan
# 環境適用
$ terraform apply
起動確認
EC2を落とす
$ terraform destroy
公開鍵を設定したEC2インスタンスを構築
キーペアを作成する
# キーペアを作成する
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/`user_name`/.ssh/id_rsa): `file_path`/ec2_access_key
Enter passphrase (empty for no passphrase): #今回はパスワードなしEnter
Enter same passphrase again: #今回はパスワードなしEnter
$ ls
ec2_access_key ec2_access_key.pub main.tf
# 秘密鍵を.ssh配下に移動
$ mv ./ec2_access_key ~/.ssh/ec2_access_key
$ ls
ec2_access_key.pub main.tf
main.tfファイルで公開鍵の情報を追加
ついでにec2のタグでインスタンスに名前をつける
main.tf
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_key_pair" "default" {
key_name = "ec2_access_key"
public_key = file("./ec2_access_key.pub")
}
resource "aws_instance" "default" {
ami = "ami-09ebacdc178ae23b7" # Amazon Linux 2 AMI (HVM), SSD Volume Type(64 ビット x86)
instance_type = "t2.micro"
key_name = aws_key_pair.default.key_name
tags = {
Name = "test-server"
}
}
ec2インスタンスを起動する
$ terraform plan
$ terraform apply
起動確認
ssh接続を検証
構築したec2に対して暗号鍵を用いてssh接続してみる
$ ssh -i ~/.ssh/ec2_access_key ec2-user@`public_ip`
ssh: connect to host `public_ip` port 22: Operation timed out
接続できないとのこと
ポート周りの設定をしていなかったためと思われる
ec2のport 22を解放する
main.tf
にセキュリティグループの情報を追加する
main.tf
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_key_pair" "default" {
key_name = "ec2_access_key"
public_key = file("./ec2_access_key.pub")
}
resource "aws_security_group" "default" {
name = "ssh_connection"
ingress {
cidr_blocks = ["0.0.0.0/0"]
protocol = "tcp"
from_port = 22
to_port = 22
}
}
resource "aws_instance" "default" {
ami = "ami-09ebacdc178ae23b7" # Amazon Linux 2 AMI (HVM), SSD Volume Type(64 ビット x86)
instance_type = "t2.micro"
# port
vpc_security_group_ids = [aws_security_group.default.id]
# key
key_name = aws_key_pair.default.key_name
# name
tags = {
Name = "test-server"
}
}
設定を反映させる
$ terraform plan
$ terraform apply
ssh接続を検証してみる
$ ssh -i ~/.ssh/ec2_access_key ec2-user@`public_ip`
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
4 package(s) needed for security, out of 16 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-`private_ip` ~]$
無事に接続を確認