私の最初の経験は、地形とアマゾン
36778 ワード
皆さんこんにちは!
今日は元気?私はあなたが素晴らしいことを願っています.私はTerraformを学ぶために興奮しているので、私は私の経験とメモを文書化するためにこれを書いています.
私の名前はBerviantoレオPratamaです.私は、より多くのdevops世界を知りたいソフトウェアエンジニアです.あなたが私の記事を楽しんでくれることを願っています.私は、devac世界の専門家ではありません.私はまだDevopsについてもっと学ぶ必要があると信じています.
コードを試したいなら、ツール(terraform)を必要とします.Torraform CLI hereをダウンロードしてください.とにかく、私のterraform CLIバージョンは1.11.7です.
私はちょうど探索し、テラフォームとAWSについての詳細を知りたいので.私は今、最高の特権を使用しています.私はAdministrorAccessを使用します.ご利用には必ずお使いください.
あなたは地形雲を使用する必要があります.Torraform雲を使用する場合は、this guideを使用してください.しかし、それは現在必要ではありません.
私の目標についてTLLR.私は私のサービスとして
私のAWS IAC (コードとしてのインフラストラクチャ)
は は は すべてのリソースの展開が完了するまで待ちます.長い時間がかかるかもしれない. 終了して成功した後、あなたの公共ロードバランサとそれにアクセスしようとします.例として、ここは私のです.
お読みありがとうございます.あなたがこの長い(コードのため)記事を読むとき、私は本当に感謝します.
今日は元気?私はあなたが素晴らしいことを願っています.私はTerraformを学ぶために興奮しているので、私は私の経験とメモを文書化するためにこれを書いています.
私の名前はBerviantoレオPratamaです.私は、より多くのdevops世界を知りたいソフトウェアエンジニアです.あなたが私の記事を楽しんでくれることを願っています.私は、devac世界の専門家ではありません.私はまだDevopsについてもっと学ぶ必要があると信じています.
準備
コードを試したいなら、ツール(terraform)を必要とします.Torraform CLI hereをダウンロードしてください.とにかく、私のterraform CLIバージョンは1.11.7です.
ユーザを準備する
私はちょうど探索し、テラフォームとAWSについての詳細を知りたいので.私は今、最高の特権を使用しています.私はAdministrorAccessを使用します.ご利用には必ずお使いください.
追加
あなたは地形雲を使用する必要があります.Torraform雲を使用する場合は、this guideを使用してください.しかし、それは現在必要ではありません.
ジャンプしましょう
私の目標についてTLLR.私は私のサービスとして
Nginx
を使用します.また、Amazon ECS FargateとALB(アプリケーションロードバランサー)を使用します.要約すると、ロードバランサを使用してサービスにアクセスし、サンプリングにNGinxを使用します.1 .メインを準備します。tfとAWSをプロバイダーとして追加します。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.0"
}
}
}
注意:クラウド状態を設定することができます.私が探検しているとき、私はローカル州を使用しています.しかし、その後、私は私のgithubリポジトリでクラウド状態を使用するように移行します.2 . AWSプロバイダーの設定
provider "aws" {
alias = "ap-southeast-1"
region = "ap-southeast-1"
}
注意:あなたの欲求領域を設定してください.私は、AP - southeast - 1(シンガポール)を使います.セットアップネットワーク
resource "aws_default_vpc" "my-personal-web" {
provider = aws.ap-southeast-1
tags = {
env = "dev"
}
}
resource "aws_default_subnet" "my-personal-web" {
provider = aws.ap-southeast-1
availability_zone = "ap-southeast-1a"
tags = {
env = "dev"
}
}
resource "aws_default_subnet" "my-personal-web-1" {
provider = aws.ap-southeast-1
availability_zone = "ap-southeast-1b"
tags = {
env = "dev"
}
}
resource "aws_security_group" "my-personal-web" {
provider = aws.ap-southeast-1
name = "allow_http"
description = "Allow HTTP inbound traffic"
vpc_id = aws_default_vpc.my-personal-web.id
ingress {
description = "Allow HTTP for all"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
注意:デフォルトのVPC & SubnetとConfig新セキュリティグループを使ってポート80のみを開きます.以来、私は私のサービスとしてnginx
を使用します.あなたは、生産使用のために正しくVPCとSubnetを必要とします.ロードバランサの設定
resource "aws_lb" "my-personal-web" {
provider = aws.ap-southeast-1
name = "my-personal-web-lb-tf"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.my-personal-web.id]
subnets = [aws_default_subnet.my-personal-web.id, aws_default_subnet.my-personal-web-1.id]
tags = {
env = "dev"
}
}
resource "aws_lb_target_group" "my-personal-web" {
provider = aws.ap-southeast-1
name = "tf-my-personal-web-lb-tg"
port = 80
protocol = "HTTP"
target_type = "ip"
vpc_id = aws_default_vpc.my-personal-web.id
}
resource "aws_lb_listener" "my-personal-web" {
provider = aws.ap-southeast-1
load_balancer_arn = aws_lb.my-personal-web.arn
port = "80"
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.my-personal-web.arn
}
}
注意:ポート80を使用します.たぶん、あなたは生産のために443を必要とするでしょう.5 . AmazonのECSの設定
resource "aws_ecs_cluster" "my-personal-web" {
provider = aws.ap-southeast-1
name = "my-personal-web-api-cluster"
}
resource "aws_ecs_cluster_capacity_providers" "my-personal-web" {
provider = aws.ap-southeast-1
cluster_name = aws_ecs_cluster.my-personal-web.name
capacity_providers = ["FARGATE"]
}
resource "aws_ecs_task_definition" "my-personal-web" {
provider = aws.ap-southeast-1
family = "service"
requires_compatibilities = ["FARGATE"]
network_mode = "awsvpc"
cpu = 1024
memory = 2048
container_definitions = jsonencode([
{
name = "my-personal-web-api"
image = "nginx"
cpu = 1024
memory = 2048
essential = true
portMappings = [
{
containerPort = 80
hostPort = 80
}
]
}
])
}
resource "aws_ecs_service" "my-personal-web" {
provider = aws.ap-southeast-1
name = "my-personal-web"
cluster = aws_ecs_cluster.my-personal-web.id
task_definition = aws_ecs_task_definition.my-personal-web.arn
desired_count = 2
launch_type = "FARGATE"
network_configuration {
subnets = [aws_default_subnet.my-personal-web.id, aws_default_subnet.my-personal-web-1.id]
security_groups = [aws_security_group.my-personal-web.id]
assign_public_ip = true
}
load_balancer {
target_group_arn = aws_lb_target_group.my-personal-web.arn
container_name = "my-personal-web-api"
container_port = 80
}
tags = {
env = "dev"
}
}
フルコード
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.0"
}
}
}
# Configure the AWS Provider
provider "aws" {
alias = "ap-southeast-1"
region = "ap-southeast-1"
}
resource "aws_default_vpc" "my-personal-web" {
provider = aws.ap-southeast-1
tags = {
env = "dev"
}
}
resource "aws_default_subnet" "my-personal-web" {
provider = aws.ap-southeast-1
availability_zone = "ap-southeast-1a"
tags = {
env = "dev"
}
}
resource "aws_default_subnet" "my-personal-web-1" {
provider = aws.ap-southeast-1
availability_zone = "ap-southeast-1b"
tags = {
env = "dev"
}
}
resource "aws_security_group" "my-personal-web" {
provider = aws.ap-southeast-1
name = "allow_http"
description = "Allow HTTP inbound traffic"
vpc_id = aws_default_vpc.my-personal-web.id
ingress {
description = "Allow HTTP for all"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_lb" "my-personal-web" {
provider = aws.ap-southeast-1
name = "my-personal-web-lb-tf"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.my-personal-web.id]
subnets = [aws_default_subnet.my-personal-web.id, aws_default_subnet.my-personal-web-1.id]
tags = {
env = "dev"
}
}
resource "aws_lb_target_group" "my-personal-web" {
provider = aws.ap-southeast-1
name = "tf-my-personal-web-lb-tg"
port = 80
protocol = "HTTP"
target_type = "ip"
vpc_id = aws_default_vpc.my-personal-web.id
}
resource "aws_lb_listener" "my-personal-web" {
provider = aws.ap-southeast-1
load_balancer_arn = aws_lb.my-personal-web.arn
port = "80"
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.my-personal-web.arn
}
}
resource "aws_ecs_cluster" "my-personal-web" {
provider = aws.ap-southeast-1
name = "my-personal-web-api-cluster"
}
resource "aws_ecs_cluster_capacity_providers" "my-personal-web" {
provider = aws.ap-southeast-1
cluster_name = aws_ecs_cluster.my-personal-web.name
capacity_providers = ["FARGATE"]
}
resource "aws_ecs_task_definition" "my-personal-web" {
provider = aws.ap-southeast-1
family = "service"
requires_compatibilities = ["FARGATE"]
network_mode = "awsvpc"
cpu = 1024
memory = 2048
container_definitions = jsonencode([
{
name = "my-personal-web-api"
image = "nginx"
cpu = 1024
memory = 2048
essential = true
portMappings = [
{
containerPort = 80
hostPort = 80
}
]
}
])
}
resource "aws_ecs_service" "my-personal-web" {
provider = aws.ap-southeast-1
name = "my-personal-web"
cluster = aws_ecs_cluster.my-personal-web.id
task_definition = aws_ecs_task_definition.my-personal-web.arn
desired_count = 2
launch_type = "FARGATE"
network_configuration {
subnets = [aws_default_subnet.my-personal-web.id, aws_default_subnet.my-personal-web-1.id]
security_groups = [aws_security_group.my-personal-web.id]
assign_public_ip = true
}
load_balancer {
target_group_arn = aws_lb_target_group.my-personal-web.arn
container_name = "my-personal-web-api"
container_port = 80
}
tags = {
env = "dev"
}
}
ベルビアントルオ / マイ・ワイズ
マイ・ジョーズ
私のAWS IAC (コードとしてのインフラストラクチャ)
マイ・ジョーズ.
許可MIT
View on GitHub
それを供給しましょう!
terraform init
である.terraform plan
である.この手順の変更点を確認できます.terraform apply
である.タイプyes
と入力します.ありがとう
お読みありがとうございます.あなたがこの長い(コードのため)記事を読むとき、私は本当に感謝します.
Reference
この問題について(私の最初の経験は、地形とアマゾン), 我々は、より多くの情報をここで見つけました https://dev.to/aws-builders/my-first-experience-learning-terraform-and-amazon-ecs-aws-fargate-2p7lテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol