前回の記事に続き、第2回はTerraformを使って実際にAWSリソースを作成します。
目次
- 環境構築
- Terraformでインフラ構築.ver1 ←ココ
- Terraformでインフラ構築.ver2
- Terraformでインフラ構築.ver3
- おまけ
2.Terraformでインフラ構築.ver1
このセクションでは以下を行います。
- tfstateの管理共有
- Terraformディレクトリの構成と操作
- ECR作成
- ECRプッシュ with Github Actions
実装範囲はこの辺です。
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
**/.terraform/*
*.tfstate
*.tfstate.*
*.tfvars
また、複数の環境設定を想定し、以下のようにディレクトリを分けて作成します。
terraform
└── aws
│ └── envs
│ ├── dev
│ ├── prod
│ └── stage
└── .gitignore
prod
に移動し.terraformversion
を作成、以下のようにファイルを編集します。
$ cd terraform/aws/envs/prod
$ touch .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.tf
をapp
ディレクトリと同階層に作成します。
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管理用バケットで定義したバケット名を以下のように設定します。
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.tf
はenvs/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を作成します。
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
を作成、内容を以下のようにします。
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.tf
とvariables.tf
を作成し、共通化できる箇所を定義します。
variable "name" {
type = string
}
variable "holding_count" {
type = number
default = 10
}
variables.tfでは変数名、型、デフォルト値を宣言し、具体的な値はmoduleの呼び出しもと(つまりecr.tf)から与えるようにします。
また、後述のタスク定義において、各レジストリのURLを読み込む必要があるため、先んじてoutputs.tfを作成して外部から読み込めるようにしておきます。
output "ecr_repository_this_repository_url" {
value = aws_ecr_repository.this.repository_url
}
locals.tfの作成
ecr.tfではlocal.name_prefix
やlocal.service_name
などと記述しています。
locals構文を使うことで、アプリケーションのみ使用する値、あるいはprodやdevなどの個々の環境全体に共通して使用依存するものを定義できます。
はじめにlocal.service_name
ですが、これはアプリケーションのみに使用する値として定義します。
以下のフォルダにlocals.tfを作成します。
locals {
service_name = "tfapp"
}
次にlocal.name_prefix
ですが、こちらは開発環境単位で共通して使用するlocalsにて定義します。
provider.tf
と同階層に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
を以下のように作成します。
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ファイルを作成します。
terraform {
backend "s3" {
bucket = "tfapp-tfstate"
key = "test/prod/cicd/app/tfapp_v1.5.0.tfstate"
region = "ap-northeast-1"
}
}
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
}
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とは別に分けて管理することとします。
# nginx config file
FROM nginx:alpine
COPY ./infra/docker/nginx/*.conf /etc/nginx/conf.d
COPY ./backend/public /workspace/backend/public
WORKDIR /workspace/backend
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;
}
}
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 でネットワークインフラを構築します。
他の記事