2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TerraformでWebアプリ開発 - 2. Terraformでインフラ構築.ver1

Last updated at Posted at 2025-06-25

前回の記事に続き、第2回はTerraformを使って実際にAWSリソースを作成します。

目次

  1. 環境構築
  2. Terraformでインフラ構築.ver1 ←ココ
  3. Terraformでインフラ構築.ver2
  4. Terraformでインフラ構築.ver3
  5. おまけ

2.Terraformでインフラ構築.ver1

このセクションでは以下を行います。

  1. tfstateの管理共有
  2. Terraformディレクトリの構成と操作
  3. ECR作成
  4. ECRプッシュ with Github Actions

実装範囲はこの辺です。

image.png

2-1. tfstateの管理共有

Terraformではインフラの最新状態をtfstateファイルで管理します。
チームでTerraformを利用して開発する場合は、チーム全体でこのtfstateファイルを参照・更新する運用を行います。今回はtfstateをS3に保存して管理する方法を取ります。

S3バケットの作成
以下の条件に基づいて、バケットを設定します。

バケット名: `[識別容易な任意の英字]-tfstate`
リージョン: ap-northeast-1(東京)
パブリックアクセスをすべてブロック: チェック
バージョニング: 有効にする
サーバー側の暗号化: 有効にする
暗号化キータイプ: Amazon S3キー(SSE-S3)

これで共有用のバケット作成が完了しました。
(以下バケット名はtfapp-tfstateとします。

2-2. Terraformディレクトリの構成と操作

インフラコード管理用のディレクトリを作成します。
backend/と同階層に新しくterraformディレクトリを作成します。
作成後、terraform/.gitignoreを作成し、以下のように設定します。

.
├── README.md
├── frontend
├── backend
└── terraform
    └── .gitignore
.gitignore
**/.terraform/*
*.tfstate
*.tfstate.*
*.tfvars

また、複数の環境設定を想定し、以下のようにディレクトリを分けて作成します。

terraform
└── aws
│   └── envs
│     ├── dev
│     ├── prod
│     └── stage
└── .gitignore

prodに移動し.terraformversionを作成、以下のようにファイルを編集します。

$ cd terraform/aws/envs/prod
$ touch .terraformversion 
.terraformversion
1.5.0

設定することでprod/ディレクトリ以下のTerraformバージョンを1.5.0に固定します。

prodなどの環境名ディレクトリ直下には、最終的に

.
├── app
├── cicd
│   └── app
├── log
├── network
├── provider.tf
├── routing
└── shared_locals.tf

のようにそれぞれ目的に沿ってディレクトリを分けます。
(app/以下には例えば、アプリに依存するiam,ecr,ecsなどを定義)
今回はアプリ名をtfappとします。

プロバイダー設定
クラウドにAWSを使うので、provider.tfappディレクトリと同階層に作成します。

prod/provider.tf
provider "aws" {
  region  = "ap-northeast-1"

  default_tags {
    tags = {
      Env    = "prod"
      System = "test"
    }
  }
}

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "3.42.0"
    }
  }

  required_version = "1.5.0"
}

awsのバージョンは"3.42.0"に固定します。

tfstateの保管先を指定
アプリに依存するtfstateをどこで保管するかを定義します。
.tf内でbackend構文を使えば、どこに書いても構わないですが、今回はわかりやすくbackend.tfを作成して定義します。
prod/app/[アプリ名]/backend.tfを作成し、前にtfstate管理用バケットで定義したバケット名を以下のように設定します。

prod/app/backend.tf
terraform {
  backend "s3" {
    bucket = "tfapp-tfstate"
    key    = "test/prod/app/tfapp_v1.5.0.tfstate"
    region = "ap-northeast-1"
  }
}
  • bucket: tfstate管理S3バケット名
  • key: bucket以下のファイル名指定
  • region: tfstate管理バケット名のリージョン指定

シンボリックリンクの作成
envs/prodに作成したprovider.tfenvs/prod/app以下で参照できるように、シンボリックリンクを作成して、envs/prod/provider.tfを参照できるようにします。(仮に、各ディレクトリでproviderを複製した場合、変更するたびに作成したファイルを1つずつ修正しないといけないので、シンボリックリンクを作成することで共通して使用できるようにしています)
envs/prod/appで以下のコマンドを叩きます。

$ cd app
$ ln -fs ../provider.tf provider.tf

実行することでprod/appからprovider.tfを参照できるようになります。

terraform initの実行
backendやprovider、モジュールを追加した場合は、terraform initを実行する必要があります。
envs/prod/appで、

$ terraform init

# もしaws profileを指定するなら
$ terraform init -backend-config="profile=[profile_name]"

を実行します。

Terraform has been successfully initialized!

のメッセージ表示と.terraform.lock.hclが作成されていればOKです。

2-3. ECR作成

ECR用のtfファイルを作成
AWS FargateでDockerコンテナを動かすためには、事前にDockerイメージをECR(コンテナレジストリ)で登録する必要があります。
今回はmoduleを用いて、リソースを定義することにします。
以下のディレクトリでecr.tfを作成します。

envs/prod/app/ecr.tf
module "nginx" {
  source = "../../../modules/ecr"
  name   = "${local.name_prefix}-${local.service_name}-nginx"
}

module "php" {
  source = "../../../modules/ecr"
  name   = "${local.name_prefix}-${local.service_name}-php"
}

次にmodulesをenvsと同階層に作成して、main.tfを作成、内容を以下のようにします。

aws/modules/ecr/main.tf
resource "aws_ecr_repository" "this" {
    name = var.name

    tags = {
        Name = var.name
    }
}

resource "aws_ecr_lifecycle_policy" "this" {
    policy = jsonencode(
        {
            "rules": [
                {
                    "rulePriority": 1,
                    "description": "Hold only ${var.holding_count} images, expire all others",
                    "selection": {
                        "tagStatus": "any",
                        "countType": "imageCountMoreThan",
                        "countNumber": var.holding_count
                    },
                    "action": {
                        "type": "expire"
                    }
                }
            ]
        }
    )
    repository = aws_ecr_repository.this.name
}

modules/main.tfではecrの共通した設定を定義します。ここでは、Nginxとphp両方ともリポジトリの設定を共通化させる意図があります。さらに、outputs.tfvariables.tfを作成し、共通化できる箇所を定義します。

aws/modules/ecr/variables.tf
variable "name" {
    type = string
}

variable "holding_count" {
    type = number
    default =  10
}

variables.tfでは変数名、型、デフォルト値を宣言し、具体的な値はmoduleの呼び出しもと(つまりecr.tf)から与えるようにします。

また、後述のタスク定義において、各レジストリのURLを読み込む必要があるため、先んじてoutputs.tfを作成して外部から読み込めるようにしておきます。

aws/modules/ecr/outputs.tf
output "ecr_repository_this_repository_url" {
    value = aws_ecr_repository.this.repository_url
}

locals.tfの作成
ecr.tfではlocal.name_prefixlocal.service_nameなどと記述しています。
locals構文を使うことで、アプリケーションのみ使用する値、あるいはprodやdevなどの個々の環境全体に共通して使用依存するものを定義できます。
はじめにlocal.service_nameですが、これはアプリケーションのみに使用する値として定義します。
以下のフォルダにlocals.tfを作成します。

envs/prod/app/locals.tf
locals {
    service_name = "tfapp"
}

次にlocal.name_prefixですが、こちらは開発環境単位で共通して使用するlocalsにて定義します。
provider.tfと同階層にshared_locals.tfを作成します。

envs/prod/shared_locals.tf
locals {
  name_prefix = "${local.system_name}-${local.env_name}"
  system_name = "test"
  env_name    = "prod"
}

作成した後はprovider.tfと同じように、シンボリックリンクを作成して、ディレクトリで参照できるようにします。
envs/prod/appで以下のコマンドを叩きます。

ln -fs ../shared_locals.tf shared_locals.tf

モジュールを作成したので、最初にterraform initを実行します。
その後、terraform planを実行、terraform applyを実行すると、ECRの作成は完了です。

バックエンドやモジュールを作成した時はterraform initを実行
$ terraform init

$ terraform plan
$ terraform apply

# profile指定なら
$ AWS_PROFILE=[profile_name] terraform apply

マネジメントコンソールを開いて${local.name_prefix}-${local.service_name}-php"で指定した、コンテナが登録されていればOKです。

2-4. ECRプッシュ with Github Actions

前章で作成したECRをGithub Actionsを使って、プッシュできるようにします。
ここでは、mainブランチにプルリクがマージされた時に、ECRにイメージが自動でプッシュされるようにします。

Github Actionsワークフローの作成
Github Actionsでは、処理のまとまりをワークフローと呼びます。
YAML形式のファイルでワークフローを定義して、.github/workflowsに配置します。
.github/workflows/deploy.ymlを以下のように作成します。

.github/workflows/deploy.yml
name: deploy

on:
  push:
    branches:
      - main

env:
  AWS_REGION: ap-northeast-1
  IMAGE_TAG: ${{ github.sha }}
  SYSTEM_NAME: test
  SERVICE_NAME: tfapp

jobs:
  deploy:
    name: Deploy app to AWS Fargate
    runs-on: ubuntu-latest

    permissions:
      id-token: write
      contents: read

    steps:
      - name: Configure aws credentials for prod
        if: github.ref == 'refs/heads/main'
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.PROD_AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.PROD_AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}
          role-to-assume: ${{ secrets.PROD_AWS_ASSUME_ROLE_ARN }}
          role-duration-seconds: 1800

      - name: Set env vars for prod
        if: github.ref == 'refs/heads/main'
        run: echo "ENV_NAME=prod" >> $GITHUB_ENV

      - uses: actions/checkout@v4

      - name: Build and run Docker compose
        run: docker compose up -d --build
        working-directory: .devcontainer

      - run: |
          sudo chmod 777 \
            {backend,frontend}/node_modules \
            backend/vendor

      - name: Cache composer
        id: cache-composer
        uses: actions/cache@v4
        with:
          path: backend/vender
          key: composer-v1-${{ hashFiles('backend/composer.lock') }}

      - name: Composer install in app
        if: ${{ !steps.cache-composer.outputs.cache-hit }}
        run: composer install -n --prefer-dist --no-dev
        working-directory: backend

      - uses: aws-actions/amazon-ecr-login@v1
        id: amazon-ecr-login
        with:
          mask-password: "true"

      - name: Push nginx image to ecr
        env:
          DOCKER_BUILDKIT: 1
          ECR_REGISTRY: ${{ steps.amazon-ecr-login.outputs.registry }}
          ECR_REPOSITORY: ${{ env.SYSTEM_NAME }}-${{ env.ENV_NAME }}-${{ env.SERVICE_NAME }}-nginx
        run: |
          docker build \
            --cache-from=$ECR_REGISTRY/$ECR_REPOSITORY:latest --build-arg BUILDKIT_INLINE_CACHE=1 . \
            -f infra/docker/nginx/Dockerfile \
            -t $ECR_REGISTRY/$ECR_REPOSITORY:latest \
            -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG

      - name: Push php image to ecr
        env:
          DOCKER_BUILDKIT: 1
          ECR_REGISTRY: ${{ steps.amazon-ecr-login.outputs.registry }}
          ECR_REPOSITORY: ${{ env.SYSTEM_NAME }}-${{ env.ENV_NAME }}-${{ env.SERVICE_NAME }}-php
        run: |
          docker build \
            --cache-from=$ECR_REGISTRY/$ECR_REPOSITORY:latest --build-arg BUILDKIT_INLINE_CACHE=1 . \
            -f infra/docker/php/Dockerfile \
            -t $ECR_REGISTRY/$ECR_REPOSITORY:latest \
            -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG

name: deploy: deloyというワークフロー名を定義
on: push: branches:: ワークフローアクションを発火させるイベントを定義
ここでは、指定したmainブランチに対してプルリクがマージされた時(push)にデプロイ処理が行われる。
env:: 環境変数を定義。ここで定義された環境変数は、ワークフロー全体に適用される。
ジョブの配下で設定するとそのジョブに、ステップで定義すると、そのステップのみに適用される。

ジョブとステップの関係
親と子の関係を持つ。
1つのジョブに複数のステップを定義することで、ジョブ1つで1つの処理のまとまりを定義することができる

jobs: deploy: jobs配下に任意のジョブIDを定義
jobs: deploy: name:、ジョブ名を定義
→ここで定義したものは、どのジョブが実行中であるかを画面上で確認できるので、認識しやすい記述をお勧めします。
runs-on: ubuntu-latest: ワークフローが実行される環境のOSやバージョンを定義

以下はstepsになりますが、ざっくり流れを説明すると

- AWS認証情報を設定
- .devcontainerを使って、アプリをビルド
- ECRにログイン
- イメージをプッシュ

となっています。
ECRにイメージをプッシュするには、ECRにログインする必要があります。
{{ secrets.PROD_AWS_SECRET_ACCESS_KEY }}などの記述で、GithubのSecretsで定義した値を参照することができます。この後、このGitHubActionsを実行できるIAMユーザーを作成してその後にSecretsを設定します。

IAMユーザーの作成
デプロイの権限を持つIAMユーザーを作成します。
このIAMユーザーはこのアプリのCI/CDにかかわるものなので、以下のディレクトリで必要なtfファイルを作成します。

envs/prod/cicd/app/backend.tf
terraform {
  backend "s3" {
    bucket = "tfapp-tfstate"
    key = "test/prod/cicd/app/tfapp_v1.5.0.tfstate"
    region = "ap-northeast-1"
  }
}
envs/prod/cicd/app/iam.tf
resource "aws_iam_user" "github" {
    name = "${local.name_prefix}-${local.service_name}-github"
    tags = {
        Name = "${local.name_prefix}-${local.service_name}-github"
    }
}

resource "aws_iam_role" "deployer" {
    name = "${local.name_prefix}-${local.service_name}-deployer"
    assume_role_policy = jsonencode(
        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "sts:AssumeRole",
                        "sts:TagSession"
                    ],
                    "Principal": {
                        "AWS": aws_iam_user.github.arn
                    }
                }
            ]
        }
    )
    tags = {
        Name = "${local.name_prefix}-${local.service_name}-deployer"
    }
}

data "aws_iam_policy" "ecr_power_user" {
    arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser"
}

resource "aws_iam_role_policy_attachment" "role_deployer_policy_ecr_power_user" {
    role = aws_iam_role.deployer.name
    policy_arn = data.aws_iam_policy.ecr_power_user.arn
}
envs/prod/cicd/app/locals.tf
locals {
  service_name = "tfapp"
}

作成した後はシンボリックリンクを作成します。
envs/prod/cicd/appで以下のコマンドを叩きます。

$ ln -fs ../../provider.tf provider.tf
$ ln -fs ../../shared_locals.tf shared_locals.tf

最後に以下を実行してIAMユーザーを作成します。

$ terraform init
$ terraform apply

IAMユーザーが作成されれば、マネジメントコンソールからアクセスキーIDとシークレットアクセスキーを発行します。

$ aws iam create-access-key --user-name test-prod-tfapp-github 

発行したIDとアクセスキーの画面をそのままにして、作成したgithubリポジトリに移動、以下の作業を行ってSecretsを設定します。

  • 上部のSettingsタブを選択
  • 左メニューのSecrets and Variables を選択
  • Actions を選択
  • 「New repository secret」押下
  • 以下、各種設定
    • PROD_AWS_ACCESS_KEY_ID
    • PROD_AWS_SECRET_ACCESS_KEY
    • PROD_AWS_ASSUME_ROLE_ARN ←作成したdeployerロール(ここでいうtest-prod-tfapp-deployer)ARNをコピーして貼り付け

mainブランチにこれまでのコードをプッシュしてワークフローが正常に終了すればOKです。

複数の開発環境に応じて機能させる場合
これまではprodで実行していますが、GithubActionsで開発環境はdevelopブランチでワークフローを適用させたい場合について紹介します。
最初に発火するイベントですが、これはmainの下にdevelopを追記すれば、developにプッシュされた時にワークフローが起動できるようになります。
先ほど設定したAWS認証情報などは各開発環境に依存する値なため、プッシュされたブランチに応じて異なる値を設定する必要があります。この場合は、以下のように、

- name: Configure aws credentials for prod
  if: github.ref == 'refs/heads/main'

と記述することで、ブランチmainの時は にステップのブロックを適用させることができます。
また、後続処理がmainプッシュであるものを情報として持たせたい場合は、

- name: Set env vars for prod
  if: github.ref == 'refs/heads/main'
  run: echo "ENV_NAME=prod" >> $GITHUB_ENV

のように記述して、GITHUB_ENVにENV_NAMEを持たせることができます。
${{ env.ENV_NAME }}とすると、ENV_NAMEで設定した内容を後述の処理に持たせることができます。

最後に、コンテナ用に/workspace/infra/docker以下にnginx/phpそれぞれのDockerfileを作成します。
これは、devcontainerで定義したものを少し編集したものですが、今回はイメージをプッシュするDockerファイルを.devcontainerとは別に分けて管理することとします。

/workspace/infra/docker/nginx/Dockerfile
# nginx config file
FROM nginx:alpine

COPY ./infra/docker/nginx/*.conf /etc/nginx/conf.d 

COPY ./backend/public /workspace/backend/public

WORKDIR /workspace/backend
/workspace/infra/docker/nginx/container.conf
log_format combined_backend 'backend $remote_addr - $remote_user [$time_local] '
        '"$request" $status $body_bytes_sent '
        '"$http_referer" "$http_user_agent $request_time"';

access_log /dev/stdout combined;
error_log /dev/stderr warn;
server_tokens off;

proxy_buffer_size 32k;
proxy_buffers 50 32k;
proxy_busy_buffers_size 64k;

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    // 任意のサブドメインを指定
    server_name subdomain.tfapp.net;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    open_file_cache max=100000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    client_max_body_size 300m;

    listen 80;
    # listen 443 ssl;

    root /workspace/backend/public;
    access_log /dev/stdout combined_backend;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php index.html index.htm;

    charset utf-8;
    # error_page 404 /index.php;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
    location /images/ { access_log off; }
    location /fonts/ { access_log off; }
    location /css/ { access_log off; }
    location /js/ { access_log off; }

    location ~ /\.(?!well-known).* {
        deny all;
    }

    # location /storage/ {
    #     root /workspace/backend/storage/app;
    # }

    location /login {
        try_files $uri $uri/ /index.php?$query_string;

    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        # try_files $uri $uri?$args $uri/ /index.php?$uri&$args /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

server {
    listen       80  default_server;
    server_name  _;

    location = /healthcheck {
        return 200;
        access_log off;
        break;
    }

    location / {
        return 403;
    }
}
/workspace/infra/docker/php/Dockerfile

FROM php:8.1.18-fpm-bullseye

# Avoid warnings by switching to noninteractive
ENV DEBIAN_FRONTEND=noninteractive

# This Dockerfile adds a non-root user with sudo access. Use the "remoteUser"
# property in devcontainer.json to use it. On Linux, the container user's GID/UIDs
# will be updated to match your local UID/GID (when using the dockerFile property).
# See https://aka.ms/vscode-remote/containers/non-root-user for details.
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID

RUN apt-get update \
    && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 \
    # install git iproute2, procps, lsb-release (useful for CLI installs)
    && apt-get -y install --no-install-recommends \
    git openssh-client less iproute2 procps iproute2 lsb-release zip unzip \
    jq vim locales default-mysql-client rsync groff-base \
    python3-pip python3-dev python3-setuptools \
    # require generate pdf
    libjpeg62-turbo xfonts-75dpi fontconfig libx11-6 libxcb1 libxext6 libxrender1 \
    xfonts-base libfontconfig1 fontconfig-config libjpeg62-turbo libxdmcp6 libxau6 \
    libx11-data ucf fonts-dejavu-core sensible-utils fonts-noto-cjk \
    # require npm install.. dart-sass
    python2 \
    # require docker
    ca-certificates gnupg \
    #
    # locale ja_JP.UTF-8
    && sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen \
    && locale-gen \
    && update-locale LANG=ja_JP.UTF-8 \
    && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    && echo 'Asia/Tokyo' > /etc/timezone \
    #
    # php.ini
    && mv /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini \
    && sed -i -E 's/^;?date.timezone =.*/date.timezone = Asia\/Tokyo/' /usr/local/etc/php/php.ini \
    && { \
    echo "memory_limit = 512M"; \
    echo "post_max_size = 300M"; \
    echo "upload_max_filesize = 500M"; \
    } > /usr/local/etc/php/conf.d/app.ini \
    #
    # Install xdebug
    && yes | pecl install xdebug-3.1.6 \
    && { \
    echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)"; \
    echo "xdebug.log=/tmp/xdebug.log"; \
    echo "xdebug.mode=develop, debug"; \
    echo "xdebug.start_with_request=yes"; \
    echo "xdebug.client_host=host.docker.internal"; \
    echo "xdebug.client_port=9003"; \
    } > /usr/local/etc/php/conf.d/xdebug.ini \
    && touch /tmp/xdebug.log \
    && chmod 666 /tmp/xdebug.log \
    #
    # For php:
    && apt-get -y install libonig-dev \
    # Docker
    && curl -fsSL https://get.docker.com -o get-docker.sh && sh ./get-docker.sh && rm -f get-docker.sh \
    #
    # Create a non-root user to use if preferred - see https://aka.ms/vscode-remote/containers/non-root-user.
    && groupadd --gid $USER_GID $USERNAME \
    && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \
    # [Optional] Add sudo support for the non-root user
    && apt-get install -y sudo \
    && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME\
    && chmod 0440 /etc/sudoers.d/$USERNAME \
    #
    # Clean up
    && apt-get autoremove -y \
    && apt-get clean -y \
    && rm -rf /var/lib/apt/lists/* \
    && docker-php-ext-install opcache pdo_mysql bcmath \
    && yes | pecl install apcu \
    && docker-php-ext-enable apcu \
    && python3 -m pip install --upgrade pip \
    && pip3 install openpyxl jq wheel \
    && python3 -m pip install --upgrade Pillow

RUN if [ "aarch64" = $(uname -m) ]; then \
    curl -sSL https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.bullseye_arm64.deb -o wkhtmlto.deb; \
    dpkg -i wkhtmlto.deb; \
    rm -rf wkhtmlto.deb; \
    fi

# Switch back to dialog for any ad-hoc use of apt-get
ENV DEBIAN_FRONTEND=dialog

# [Optional] Install a version of Node.js using nvm for front end dev
ARG INSTALL_NODE="true"
ARG NODE_VERSION="lts/*"
RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "umask 0002 && curl -sS -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash && . ~/.nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi

# php-fpm.sock
RUN mkdir -p /var/run/php-fpm
COPY ./.devcontainer/docker/app/php-fpm.d/zzz-www.conf /usr/local/etc/php-fpm.d/zzz-www.conf

# composer command
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# .bash_aliases
RUN { \
    echo "export LANG=ja_JP.UTF-8"; \
    echo "alias ll='ls -al'"; \
    echo "alias la='ls -A'"; \
    echo "alias l='ls -CF'"; \
    echo "alias ti='terraform init'"; \
    echo "alias tf='terraform fmt'"; \
    echo "alias tp='terraform plan'"; \
    echo "alias to='terraform output'"; \
    echo "alias ta='terraform apply'"; \
    echo "alias taf='terraform apply -auto-approve'"; \
    echo "alias tfu='terraform force-unlock'"; \
    } > /home/vscode/.bash_aliases

# tfenv install
# RUN su "vscode" -c "git clone https://github.com/tfutils/tfenv.git ~/.tfenv" 2>&1 \
#     && echo 'export PATH="$PATH:~/.tfenv/bin"' >> "/home/vscode/.bashrc" \
#     && su "vscode" -c '~/.tfenv/bin/tfenv install 1.5.0 && ~/.tfenv/bin/tfenv use 1.5.0'

# AWS CLI v2 install
# RUN curl -sS "https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip" -o "awscliv2.zip" \
#     && unzip awscliv2.zip \
#     && ./aws/install \
#     && rm -rf aws awscliv2.zip

# [Optional] Uncomment this line to install global node packages.
RUN su vscode -c "source ~/.nvm/nvm.sh && npm install -g npm-check-updates depcheck aws-cdk@^2" 2>&1

# [Optional] If your pip requirements rarely change, uncomment this section to add them to the image.
COPY ./.devcontainer/docker/app/requirements.txt /tmp/pip-tmp/
RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \
    && rm -rf /tmp/pip-tmp

COPY --chown=www-data:www-data ./backend /workspace/backend

WORKDIR /workspace/backend

以降はmainブランチにプッシュすることで、常にGitHubActionsが起動し、ECRにイメージをプッシュするようになります。

次回

ここまでで2.Terraformでインフラ構築.ver1が終了しました。
次は、Terraformでインフラ構築.ver2 でネットワークインフラを構築します。

他の記事

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?