Terraformの知識
インストール
流れ
- 構成とコストを設計する
- EC2, VPC, Public subnetを使う
- EC2: Amazon Elastic Compute Cloud クラウド上の仮想サーバー作成サービス
- VPC: Amazon Virtual Private Cloud AWSクラウド内にユーザー専用の隔離された仮想ネットワーク空間作成できるサービス
- NAT Gateway, ALB, RDSはまだ使わない
-
公開するポートを決める
-
ローカル環境を準備する
- Terraformをインストール
- AWS CLIをインストール
-
Gitリポジトリを準備
-
AWS認証を準備する
- IAMユーザーを作成
- aws loginを設定
- Terraform用のプロファイルを設定
-
aws sts get-caller-identityで確認
-
Terraformを初期化する
- AWS Providerを定義
- terraform init
- terraform fmt
-
terraform validate
-
AWSネットワークを構築する
- VPC
- Public Subnet
- Internet Gateway
- Route Table
- Route Table Association
-
Security Group
-
EC2を構築する
- Ec2をPublic Subnetへ配置
- パブリックIPv4を割当
- Security Groupを割当
- SSHまたはSystems Managerで接続できるようにする
-
EBS容量を明示する
-
Terraformで確認・反映する
- terraform plan
- 作成対象と削除対象を確認
- terraform apply
-
terraform planで差分が無いことを確認
-
EC2条にアプリ環境を構築する
- Docker Engineをインストール
- Docker Composeを利用可能にする
- FastAPIのソースコードを配置
- docker-compose.yamlを配置
-
環境変数を設定
-
FastAPIとPostgreSQLを起動する
- FastAPIコンテナ
- PostgreSQLコンテナ
- Docker内部ネットワークで接続
- PostgreSQLの5432番ポートは外部公開しない
-
PostgreSQL用の名前付きVolumeを作る
-
動作を確認する
- コンテナの起動状態
- FastAPIからPostgreSQLへの接続
- PCのブラウザーからFastAPIへのアクセス
- EC2再起動後のデータ保持
- 不要なポートが閉じていること
-
コストと運用を整える
- AWS Budgetsを設定
- 学習終了時にEC2を停止
- バックアップが必要なら検討
- 不要になったら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 -
なぜ
developterraform-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