<aws-EC2>TerraformでPython実行環境を構築する

aws

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
}
JavaScript

Terraform 実行プランの適用(Apply)

Apply実行後、EC2にSSHで接続(SSHでの接続方法)し、構築結果を確認します。

python3 --version
Python 3.9.16
Shell

実行ログは「cat /var/log/cloud-init-output.log」で確認できます。

環境が正しく作成されない場合
OK 「user_data = <<-EOF」 ※そのままのインデントや空白を保持する
NG 「user_data = <<EOF」 ※ハイフン付きヒアドキュメントで、終了タグのインデントに合わせて先頭の空白を自動的に削除する

札幌在住エンジニア。JavaやPHPやWordPressを中心とした記事が中心です。

【SE歴】四半世紀以上
【Backend】php / java(spring) / c# / AdobeFlex / c++ / VB / cobol
【Frontend】 vue.js / jquery他 / javascript / html / css
【DB】oracle / mysql / mariadb / sqlite
【infrastructure】aws / oracle / gcp
【license】aws(saa-c03) / oracle master / XML Master / Sun Certified Programmer for the Java 2 Platform 1.4

Nobelをフォローする
aws
Nobelをフォローする

コメント

タイトルとURLをコピーしました