TerraformでのEC2インスタンス作成
awsのEC2にSSH接続し、awsのEC2上でPythonを実行できる環境を構築するまでをゴールとします。Terraformの超初歩の使い方はこちらを確認してください。
Terraform用の設定ファイルを作成
tfファイルの全文を載せておきます。AmazonLinux2022の構築なので、yumではなく、dnfになります。
# デフォルトのAWSプロバイダー設定
provider "aws" {
region = "ap-northeast-1" # 東京リージョンを指定
profile = "yourProfile" # 使用するAWSプロファイルを指定
}
# VPCの作成
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16" # CIDRブロックを指定
tags = {
Name = "YourNameVPC"
}
}
# パブリックサブネットの作成
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24" # CIDRブロックを指定
availability_zone = "ap-northeast-1a" # アベイラビリティゾーンを指定
map_public_ip_on_launch = true # インスタンス起動時に自動でパブリックIPを付与する
tags = {
Name = "YourNamePublicSubnet"
}
}
# インターネットゲートウェイの作成
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id # 作成したVPCにアタッチ
tags = {
Name = "YourNameIGW"
}
}
# パブリックルートテーブルの作成
resource "aws_route_table" "public_rt" {
vpc_id = aws_vpc.main.id # 作成したVPCに関連付け
route {
cidr_block = "0.0.0.0/0" # インターネットへのルーティングを設定
gateway_id = aws_internet_gateway.igw.id # インターネットゲートウェイを指定
}
tags = {
Name = "YourNamePublicRouteTable"
}
}
# サブネットとルートテーブルの関連付け
resource "aws_route_table_association" "public_assoc" {
subnet_id = aws_subnet.public.id # パブリックサブネットを指定
route_table_id = aws_route_table.public_rt.id # パブリックルートテーブルを指定
}
# SSH接続用セキュリティグループの作成
resource "aws_security_group" "ssh" {
vpc_id = aws_vpc.main.id # 作成したVPCに関連付け
name = "YourNameAllowSSH"
description = "Allow inbound SSH traffic on port 22"
# インバウンドルール(SSH接続を許可)
ingress {
description = "SSH access from anywhere (for testing; restrict in production)"
from_port = 22 # SSHのポート番号
to_port = 22 # SSHのポート番号
protocol = "tcp" # TCPプロトコル
cidr_blocks = ["0.0.0.0/0"] # どこからでも接続を許可
}
# アウトバウンドルール(全てのトラフィックを許可)
egress {
description = "Allow all outbound traffic"
from_port = 0 # すべてのポートを許可
to_port = 0 # すべてのポートを許可
protocol = "-1" # すべてのプロトコルを許可
cidr_blocks = ["0.0.0.0/0"] # どこへでも接続を許可
}
tags = {
Name = "YourNameAllowSSH"
}
}
# Amazon Linux3のAMIベースにt2.microのEC2を作成
resource "aws_instance" "youreName-server" {
ami = "ami-0dfa284c9d7b2adad" # Amazon Linux3
instance_type = "t2.micro" # インスタンスタイプを指定
subnet_id = aws_subnet.public.id # パブリックサブネットに配置
vpc_security_group_ids = [aws_security_group.ssh.id] # SSH接続用セキュリティグループを指定
# 事前に作成済みのキーペア名を指定
key_name = "yourProfileKeyPair"
tags = {
Name = "YourNameServerInstance"
}
# パブリックIPを自動割当する(SSH接続など外部からのアクセス用)
associate_public_ip_address = true
# インスタンス起動時に実行するユーザーデータスクリプト
user_data = <<-EOF
#!/bin/bash -x
echo "Python仮想環境の作成開始"
# OSパッケージを更新する
sudo dnf update -y
# Python3をインストールする
sudo dnf install -y python3
# Pythonの仮想環境を作成する(envというディレクトリに作成)
sudo python3 -m venv /home/ec2-user/env
# 仮想環境を有効化
source /home/ec2-user/env/bin/activate
# pipのアップグレード
sudo dnf upgrade python3-pip
# 確認用のメッセージを出力
echo "Python仮想環境の作成とパッケージのインストールが完了しました。"
EOF
}
Terraform 実行プランの適用(Apply)
Apply実行後、EC2にSSHで接続(SSHでの接続方法)し、構築結果を確認します。
python3 --version
Python 3.9.16
実行ログは「cat /var/log/cloud-init-output.log」で確認できます。
環境が正しく作成されない場合
OK 「user_data = <<-EOF」 ※そのままのインデントや空白を保持する
NG 「user_data = <<EOF」 ※ハイフン付きヒアドキュメントで、終了タグのインデントに合わせて先頭の空白を自動的に削除する
コメント