Skip to content

Terraformの知識

インストール

流れ

  1. 構成とコストを設計する
  2. EC2, VPC, Public subnetを使う
    1. EC2: Amazon Elastic Compute Cloud クラウド上の仮想サーバー作成サービス
    2. VPC: Amazon Virtual Private Cloud AWSクラウド内にユーザー専用の隔離された仮想ネットワーク空間作成できるサービス
  3. NAT Gateway, ALB, RDSはまだ使わない
  4. 公開するポートを決める

  5. ローカル環境を準備する

  6. Terraformをインストール
  7. AWS CLIをインストール
  8. Gitリポジトリを準備

  9. AWS認証を準備する

  10. IAMユーザーを作成
  11. aws loginを設定
  12. Terraform用のプロファイルを設定
  13. aws sts get-caller-identityで確認

  14. Terraformを初期化する

  15. AWS Providerを定義
  16. terraform init
  17. terraform fmt
  18. terraform validate

  19. AWSネットワークを構築する

  20. VPC
  21. Public Subnet
  22. Internet Gateway
  23. Route Table
  24. Route Table Association
  25. Security Group

  26. EC2を構築する

  27. Ec2をPublic Subnetへ配置
  28. パブリックIPv4を割当
  29. Security Groupを割当
  30. SSHまたはSystems Managerで接続できるようにする
  31. EBS容量を明示する

  32. Terraformで確認・反映する

  33. terraform plan
  34. 作成対象と削除対象を確認
  35. terraform apply
  36. terraform planで差分が無いことを確認

  37. EC2条にアプリ環境を構築する

  38. Docker Engineをインストール
  39. Docker Composeを利用可能にする
  40. FastAPIのソースコードを配置
  41. docker-compose.yamlを配置
  42. 環境変数を設定

  43. FastAPIとPostgreSQLを起動する

  44. FastAPIコンテナ
  45. PostgreSQLコンテナ
  46. Docker内部ネットワークで接続
  47. PostgreSQLの5432番ポートは外部公開しない
  48. PostgreSQL用の名前付きVolumeを作る

  49. 動作を確認する

    1. コンテナの起動状態
    2. FastAPIからPostgreSQLへの接続
    3. PCのブラウザーからFastAPIへのアクセス
    4. EC2再起動後のデータ保持
    5. 不要なポートが閉じていること
  50. コストと運用を整える

    1. AWS Budgetsを設定
    2. 学習終了時にEC2を停止
    3. バックアップが必要なら検討
    4. 不要になったらterraform destroy

コマンド

  • aws login --profile xxx
  • AWS CLIへ「xxx」という認証情報を用いてログインを行う
  • aws configure get credential_process --profile xxx
  • AWS CLIを通して、「xxx」という認証情報を取得する
  • aws configure get region
  • 現在設定されているデフォルトのリージョン情報を取得する
  • aws configure list
  • AWS CLIに格納されている現在アクティブな認証情報の設定状況を表示する
  • aws configure list --profile xxx
  • AWS CLIに格納されている「xxx」という認証情報の詳細を取得する
  • aws configure list-profiles
  • AWS CLIに格納されている認証情報一覧を取得する
  • aws configure set credential_process
  • AWS CLIを通して、認証情報を設定する
  • aws configure set region yyy --profile xxx
  • AWS CLIを通して、「xxx」という認証情報に「yyy」というリージョン情報を設定する
aws configure set credential_process \
"aws configure export-credentials --profile develop --format process" \
--profile terraform-develop
  • AWS_PROFILE=terraform-develop terraform plan
  • terraform state list

  • 現在のTerraform内のユーザーをxxxに決める export AWS_PROFILE=xxx

  • 現在有効なAWSの認証情報(誰としてログインしているか)を確認する aws sts get-caller-identity

  • xxxの認証情報を確認する aws sts get-caller-identity --profile xxx

  • aws: AWS CLIを実行する
  • sts: AWS Security Token Service(一時的な認証情報などを扱うサービス)の機能
  • get-caller-identity: 現在実行しているユーザーやロールの、アカウントIDやARN(一意の識別子)を返却するAPI
  • --profile xxx: 名前を「Terraform」と付けた特定の接続設定を指して使う指定
    • 使用目的
    • 接続確認: Terraformでインフラを操作する前に、正しいAWSアカウントやIAMユーザー・ロールにつながっているか確認できる
    • 誤操作の防止:意図しない本番環境などのアカウントを操作していないか、実行前に確認する

Tips

  • AWS CLIの設定ファイルの置き場所
  • ~/.aws/config
  • ~/.aws/credentials

  • なぜdevelop terraform-developの2つがあるのか?

  • develop: 認証情報を持っている本人
  • terraform-develop: Terraformが理解できる形式へ変換する通訳

  • resource "xxx" "yyy" の各意味

部分 意味 命名
xxx AWS Providerが定めたリソースタイプ 自由に変更できない
yyy Terraform設定内で使うローカル名 自由に変更できる
  • グローバルIP取得コマンド curl https://api.ipify.org

  • 既存の公開鍵の確認コマンド ls -la ~/.ssh

  • 鍵を作るコマンド

ssh-keygen -t ed25519 -f ~/.ssh/application-management-ec2 -C "application-management-ec2"
  • -t: 鍵の種類(アルゴリズム)を指定する(ed25519やrsaなど)
  • -C: 鍵を識別するためのコメント(通常はメールアドレス)を追加する
  • -f: 保存先のファイル名を直接指定する

↓ 生成されるファイル

  • `~/ssh/application-management-ec2
  • `~/ssh/application-management-ec2.pub

aws ec2 describe-instances --filters "Name=tag:Name,Values=learn-terraform" "Name=instance-state-name,Values=pending,running,stopping,stopped" --query 'Reservations[].Instances[].{InstanceId:InstanceId,State:State.Name,PublicIPv4:PublicIpAddress,KeyPair:KeyName}' --output table

  • terraform経由でEC2の状態を確認するコマンド terraform state show aws_instance.app_server

  • SSH接続コマンド ssh -i ~/.ssh/application-management-ec2 ubuntu@13.230.218.235

  • dockerインストールコマンド&手順

sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://dowload.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.id docker-buidx-plugin docker-compose-plugin
sudo systemctl status docker --no-pager
sudo docker run -rm hello-world
docker compose version

sudo usermod -aG docker ubuntu

docker version
docker compose version
  • 実行時点でアップデート可能なパッケージのリストを更新する sudo apt update