Open10

TerraformでWordpressをデプロイする(ECS/Fargate)

not75743not75743

dockerhubに記載のdocker-compose.yamlを参考にローカルで動作確認
https://hub.docker.com/_/wordpress

docker-compose.yaml
version: '3.9'
services:
  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql
volumes:
  wordpress:
  db:
not75743not75743

tfファイル準備中...
以下メモ

default_tag

全リソースに共通のタグをつける

provider "aws" {
 default_tags {
   tags = {
     Environment = "Test"
     Owner       = "TFProviders"
     Project     = "Test"
   }
 }
}

https://www.hashicorp.com/blog/default-tags-in-the-terraform-aws-provider

変数をnameタグに埋め込む

環境とかプロジェクト名をつけるとわかりやすい

variable "system_name" {
  default="test-system"
}

resource "aws_vpc" "vpc" {
  tags = {
    Name      = "${var.system_name}_vpc"
  }
}
not75743not75743

手動で試す

RDS

サブネットグループ作成

RDS作成時に指定するため

データベース作成

  • DBエンジンタイプはmysql
  • バージョンは8.0.32
  • 無料枠
  • masterのユーザーネーム、パスワードを設定
  • インスタンスサイズはdb.t3.micro
  • ストレージサイズのオートスケールが出来るんですね
  • パブリックアクセスはなし
  • 事前に作成したサブネットグループ、セキュリティグループを割り当てる
  • パスワード認証を有効化
  • データベース名は「wordpress」、パラメータグループはデフォルトの「default.mysql8.0」

https://zenn.dev/supersatton/articles/174670736ce559#③rdsインスタンス作成

not75743not75743

タスク定義

wordpressイメージ、環境変数を間違えなければOK

  • イメージ
    • ECRに格納したイメージを指定
  • 環境変数
    • WORDPRESS_DB_HOST:RDSエンドポイント
    • WORDPRESS_DB_NAME:データベース名(wordpress
    • WORDPRESS_DB_PASSWORD:設定したパスワード
    • WORDPRESS_DB_USER:設定した管理者
not75743not75743

でけた

OK。
適当に記事を作って、mysqlクライアントで見てみましょう

not75743not75743

テスト用ページ

wordpressコンテナにECS EXECして確認することにします。
既存のタスクでECS EXECを有効化する方法
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs-exec.html

設定

aws ecs update-service \
    --cluster <cluster> \
    --task-definition <task definition> \
    --enable-execute-command \
    --service <service> \
    --desired-count 1

ECSEXEC用IAMロールはタスク定義で設定済みのものとします。

接続

# タスクIDを確認
$ aws ecs list-tasks --cluster <cluster>

# ECS EXECする

```bash
aws ecs execute-command --cluster <cluster> \
    --task <task arn> \
    --container <container name> \
    --interactive \
    --command "/bin/bash"
not75743not75743

mysqlクライアントで確認

ECSEXECしたwordpressコンテナでmysqlクライアントをインストール、記事の確認をします

# クライアントインストール
apt update
apt install -y default-mysql-client

# 接続
mysql -h <エンドポイント> -u <管理者ユーザ> -p

# 記事確認
use wordpress;

MySQL [wordpress]> select ID,post_title from wp_posts;
+----+--------------------------------+
| ID | post_title                     |
+----+--------------------------------+
|  1 | Hello world!                   |
|  2 | サンプルページ                 |
|  3 | プライバシーポリシー           |
|  4 | 自動下書き                     |
|  5 | 自動下書き                     |
|  6 | 自動下書き                     |
|  7 | テスト用ページです             |
|  8 | Custom Styles                  |
|  9 | テスト用ページです             |
+----+--------------------------------+
9 rows in set (0.000 sec)

問題なさげ

not75743not75743

DB周り

resource "aws_security_group" "rds_sg" {
  name        = "rds_sg"
  description = "Allow inbound traffic for RDS DB instance"
  vpc_id      = var.vpcid

  ingress {
    from_port   = 3306
    to_port     = 3306
    protocol    = "tcp"
    cidr_blocks = ["10.10.0.0/16"]
  }
}

resource "aws_ssm_parameter" "db_username" {
  name  = "/db/username"
  type  = "String"
  value = var.db_username
}

resource "aws_ssm_parameter" "db_password" {
  name  = "/db/password"
  type  = "SecureString"
  value = var.db_password
}

resource "aws_ssm_parameter" "db_dbname" {
  name  = "/db/dbname"
  type  = "String"
  value = var.db_dbname
}

resource "aws_db_subnet_group" "main" {
  name       = "main"
  subnet_ids = [var.public1, var.public2]

  tags = {
    Name = "My DB subnet group"
  }
}

resource "aws_db_instance" "wordpress" {
  allocated_storage      = 20
  engine                 = "mysql"
  engine_version         = "8.0.32"
  instance_class         = "db.t3.micro"
  db_name                   = aws_ssm_parameter.db_dbname.value
  username               = aws_ssm_parameter.db_username.value
  password               = aws_ssm_parameter.db_password.value
  parameter_group_name   = "default.mysql8.0"
  publicly_accessible    = false
  skip_final_snapshot    = true
  vpc_security_group_ids = [aws_security_group.rds_sg.id]
  db_subnet_group_name   = aws_db_subnet_group.main.name
}