Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/snails8/terraform-ecs-public
ECS(pub)構成 / CMS [ ECS/EC2/RDS/ etc...]
https://github.com/snails8/terraform-ecs-public
aws fargate infra terraform
Last synced: 9 days ago
JSON representation
ECS(pub)構成 / CMS [ ECS/EC2/RDS/ etc...]
- Host: GitHub
- URL: https://github.com/snails8/terraform-ecs-public
- Owner: Snails8
- Created: 2021-09-22T06:40:47.000Z (over 3 years ago)
- Default Branch: develop
- Last Pushed: 2022-01-04T05:09:54.000Z (about 3 years ago)
- Last Synced: 2024-12-07T15:04:45.936Z (2 months ago)
- Topics: aws, fargate, infra, terraform
- Language: HCL
- Homepage:
- Size: 632 KB
- Stars: 0
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# sample-terraform
![Image](.docs/ECS.drawio.png)
### 環境変数をsetする---
1. .envに値をsetする
```
$ cp .env.example .env
```
```
注意
TF_VAR_APP_NAME -> 必ず対象アプリケーションのリポジトリ名にすること(小文字ハイフンつなぎ)
TF_VAR_DB_MASTER_NAME,TF_VAR_DB_MASTER_PASS -> 共にハイフンは使用不可
TF_VAR_DB_NAME -> 文字列+数字にすること (ハイフン,文字列のみは使用不可)
TF_VAR_DOMAIN, TF_VAR_ZONE -> Route53に登録してあるもの
TF_VAR_LOKI_USER, TF_VAR_LOKI_PASS -> なくても問題ない
```2. public キーをセットする
```shell:
$ vim ec2/sample-ec2-key.pub
```### TerraformでAWS環境のbuildする
---
1. Terraform の読み込みと環境の作成
```shell:
$ docker-compose up -d --build
$ make init
$ make apply> Apply complete! Resources: 54 added, 1 changed, 0 destroyed!
```2. ビルドした AWS環境 の環境変数を SSM に設定する
```shell:
// .env.productionに値の書き込み
$ make outputs> DB_HOST末尾のportだけ削除(:5432 の削除)
// SSM (パラメーターストア)に値の登録
// .env.production にあるvalueを登録 or 上書き
$ make ssm-store
```3. ECRにイメージをpushする
```
// set ECR
$ make ecr-repo
```### アプリケーション側の設定
---
1. .env.githubの環境変数を確認して環境変数を登録する
```shell:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_ACCOUNT_ID *awsにlogin後、右上の画面を確認すると以下画像のように見れる
SUBNETS *outputsで確認後 [] 内の内容のみを登録
SECURITY_GROUPS *outputsで確認して登録
LOKI_ID *コメントアウトで不要
LOKI_SECRET *コメントアウトで不要
```2. Task-definitionの環境の参照先を注意する
```json:
# SSM に値がある場合
{
"name": "AWS_ACCESS_KEY_ID",
"valueFrom": "/SED_TARGET_APP_NAME/ACCESS_KEY_ID"
},# 登録していない場合
{
"name": "APP_URL",
"value": "https://snails8.site"
},
```## 注意
Q how to connect ec2 ?
```
$ ssh -i ~/.ssh/秘密鍵 ec2-user@IPアドレス
```Q. RDS instance failed to create
please check .env value
```
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html
・1〜16文字の英数字とアンダースコアを含めることができます。
・その最初の文字は文字でなければなりません。
・データベースエンジンによって予約された単語にすることはできません。✕: ハイフン(-), ✕:誰もが使いそうなusername=admin (すでに予約されているため)
```## CI/CD
It is a CI/CD env that does not directly handle credential information
Please be careful if you want to use
```
En
・When copying and pasting, pay attention to the repository specification destination (GHA-terraform.yml)
・Uncomment terraform and workflow in main.tf
・Set the following 3 environment variables on GithubJp
・コピペする場合はリポジトリ指定先に注意(GHA-terraform.yml)
・main.tf 内の terraform とworkflowのコメントアウトを解除
・以下3つの環境変数をGithub上にセット
``````
AWS_ROLE_ARN=引き受けるロールのARNを指定。OHA で作成される IAM ロールの ARN
AWS_WEB_IDENTITY_TOKEN_FILE=Web IDトークンファイルへのパス
AWS_DEFAULT_REGION=デフォルトのリージョン。東京リージョンを指定したい場合はap-northeast-1
```## 運用 注意
ドメインをRoute53に登録していないと怒られるので注意開発用と本番用で分けたい場合は
variable_des.tf のように分けて運用してください## 懸念点
github-actionsでアプリケーションのdeployをしているため、task-definition が二重管理になってしまっている。外部デプロイを利用すれば回避できるが以下の問題がある
- https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/deployment-type-external.html対応策
・AWS Copilot を使用
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/getting-started-aws-copilot-cli.html・パイプラインの使用
https://zenn.dev/reireias/articles/8e987af2762eaa理想
github-actions にCodePipelineをかませる## ディレクトリ構造
## 構文
### Module
Module: リソースを集約して1つの機能としたものModuleには2種類ある
・Child Module :特定の機能をまとめたもの他mModuleから呼ばれるように設計
・Root Module :Terraformコマンドを実行するディレクトリにまとめられたTerraformリソースのこと。childに値を渡したり、呼び出したりするModule は4つのブロックを Terraform ファイルに定義すること作成できる
・resource :Moduleが作成するインフラのリソース
・data :既存のリソースを参照
・variable :変数
・output :Moduleの値を外に渡す### locals 値の使用
https://www.terraform.io/docs/language/values/locals.htmllocal values とは
・Local Valuesとはモジュール内に閉じて使える変数 (module内のローカル変数のようなもの)
・tfファイル内の変数は基本的にLocal Valuesを使う
・特に判定処理はLocal Valuesで明確な名前をつけることvariableとの違い
・Local Valuesには関数や他リソースの参照などが書ける (DRY 意識するときとか)
・Local Valuesは外部からの値の設定ができない
・Variableを使うのは外部からのインプットにする場合* 余談 variable 様々な値の設定方法
・apply実行時に対話的に入力
・コマンドラインから-varオプションや-ver-fileオプションで指定
・terraform.tfvarsファイルで指定
・環境変数(TF_VAR_xxxなど)で指定
・variableの定義時にデフォルト値を明示
つまりvariableは外部から意図しない値が入力される可能性がある。```terraform
locals {
load_balancer_count = "${var.use_load_balancer == "" ? 1 : 0}"
switch_count = "${local.load_balancer_count}"
}resource sakuracloud_load_balancer "lb" {
count = "${local.load_balancer_count}"
}resource sakuracloud_switch "sw" {
count = "${local.switch_count}"
}
```
### 注意点
・commaは書くな
Error: Unexpected comma after argument・main.tfを編集したらinitしろ