Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/test01 #1

Open
wants to merge 8 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions aws/platform/env/dev/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ variable "vpc" {
# デフォルト(NAT-instance typeを指定しない場合は)はNATGatewayを作成。
# NAT-instance typeを指定した場合はNATInstanceを作成。
nat_instance_type = null
#nat_instance_type = "t2.small"
#nat_instance_type = "t3.small"
}
}

Expand Down Expand Up @@ -72,9 +72,9 @@ variable "eks" {
# cluster
cluster = {
# name
name = "nautible-dev-cluster-v1_28"
name = "nautible-dev-cluster-v1_29"
# version
version = "1.28"
version = "1.29"
# endpoint private access
endpoint_private_access = true
# endpoint public access
Expand All @@ -84,13 +84,13 @@ variable "eks" {
# addons
addons = {
# coredns version
coredns_version = "v1.10.1-eksbuild.6"
coredns_version = "v1.10.1-eksbuild.7"
# vpc-cni version
vpc_cni_version = "v1.15.4-eksbuild.1"
vpc_cni_version = "v1.16.2-eksbuild.1"
# kube-proxy version
kube_proxy_version = "v1.28.2-eksbuild.2"
kube_proxy_version = "v1.28.4-eksbuild.4"
# aws-ebs-csi-driver
ebs_csi_driver_version = "v1.25.0-eksbuild.1"
ebs_csi_driver_version = "v1.27.0-eksbuild.1"
}
}
# fargate namespaces
Expand Down
2 changes: 0 additions & 2 deletions aws/platform/modules/eks/fargate-profile.tf
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
data "aws_caller_identity" "self" {}

resource "aws_eks_fargate_profile" "eks_fargate_profile" {
count = length(var.fargate_selectors) > 0 ? 1 : 0
cluster_name = module.eks.cluster_name
Expand Down
4 changes: 3 additions & 1 deletion aws/platform/modules/eks/main.tf
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
data "aws_caller_identity" "self" {}

module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "19.20.0"
version = "19.21.0"
cluster_version = var.cluster_version
cluster_name = var.cluster_name
subnet_ids = var.private_subnet_ids
Expand Down
2 changes: 1 addition & 1 deletion aws/platform/modules/eks/security-group.tf
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module "albc_security_group" {
source = "terraform-aws-modules/security-group/aws"
version = "4.0.0"
version = "5.1.0"

name = "${var.cluster_name}-albc-sg"
use_name_prefix = false
Expand Down
2 changes: 1 addition & 1 deletion aws/platform/modules/route53/main.tf
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module "zones" {
source = "terraform-aws-modules/route53/aws//modules/zones"
version = "2.0.0"
version = "2.11.0"
zones = {
"${var.pjname}.com" = {
comment = "${var.pjname}.com"
Expand Down
18 changes: 9 additions & 9 deletions aws/platform/modules/vpc/nat-instance.tf
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@
module "nat_instance" {
count = var.nat_instance_type == null ? 0 : 1
source = "terraform-aws-modules/ec2-instance/aws"
version = "2.17.0"
version = "5.6.0"

name = "${var.pjname}-nat-instance"
instance_count = 1
ami = data.aws_ami.nat_ami_recent[0].id
instance_type = var.nat_instance_type
monitoring = true
source_dest_check = false
vpc_security_group_ids = [module.nat_instance_security_group[0].security_group_id]
subnet_id = module.vpc.public_subnets[0]
name = "${var.pjname}-nat-instance"
ami = data.aws_ami.nat_ami_recent[0].id
instance_type = var.nat_instance_type
monitoring = true
source_dest_check = false
vpc_security_group_ids = [module.nat_instance_security_group[0].security_group_id]
subnet_id = module.vpc.public_subnets[0]
associate_public_ip_address = true

tags = {
Name = "${var.pjname}-nat-instance"
Expand Down
2 changes: 1 addition & 1 deletion aws/platform/modules/vpc/outputs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ output "private_subnet_arns" {
value = module.vpc.private_subnet_arns
}
output "nat_instance_id" {
value = var.nat_instance_type == null ? "" : module.nat_instance[0].id[0]
value = var.nat_instance_type == null ? "" : module.nat_instance[0].id
}

2 changes: 1 addition & 1 deletion aws/platform/modules/vpc/route-table.tf
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ resource "aws_route" "private_route" {
count = var.nat_instance_type != null && length(module.vpc.private_route_table_ids) > 0 ? length(module.vpc.private_route_table_ids) : 0
route_table_id = element(module.vpc.private_route_table_ids, count.index)
destination_cidr_block = "0.0.0.0/0"
network_interface_id = module.nat_instance[0].primary_network_interface_id[0]
network_interface_id = module.nat_instance[0].primary_network_interface_id
}

resource "aws_route_table_association" "private_route_table_association" {
Expand Down
2 changes: 1 addition & 1 deletion aws/platform/modules/vpc/security-group.tf
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
module "nat_instance_security_group" {
count = var.nat_instance_type == null ? 0 : 1
source = "terraform-aws-modules/security-group/aws"
version = "4.0.0"
version = "5.1.0"

name = "${var.pjname}-nat-instance-sg"
vpc_id = module.vpc.vpc_id
Expand Down
65 changes: 33 additions & 32 deletions aws/plugin/README.md
Original file line number Diff line number Diff line change
@@ -1,76 +1,77 @@
# plugin

Kubernetesへエコシステムなどの導入に必要なAWSリソースをterraformにて作成します
ディレクトリごとに1つのプラグインとして導入に必要なリソースを定義し、plugin/env/dev/variables.tfの定義内容によって各プラグインのリソースの作成可否を制御します
Kubernetes へエコシステムなどの導入に必要な AWS リソースを terraform にて作成します
ディレクトリごとに 1 つのプラグインとして導入に必要なリソースを定義し、plugin/env/dev/variables.tf の定義内容によって各プラグインのリソースの作成可否を制御します

## Terraform構成
## Terraform 構成

```text
plugin
│ main.tf ・・・リソース定義の全量を定義する(全moduleの実行定義)
│ variables.tf
├─env ・・・環境毎のディレクトリ。基本的にvariablesに定義する値だけ環境毎に変えることでコントロールする。
│ ├─dev
│ │ │ main.tf
│ │ │ variables.tf ・・・開発用の設定値
│ └─prod
│ └─prod (未作成)
│ │ main.tf
│ │ variables.tf ・・・本番用の設定値
└─modules  ・・・各種pluginリソースのまとまりでmodule化
├─kong-apigateway ・・・APIGatewayリソースのmodule
├─auth ・・・認証のリソースを作成するmodule
├─backup ・・・バックアップ保管用ストレージリソースを作成するmodule。環境削除時もバックアップは残るように独立したプロジェクトで作成。
├─init ・・・このTerraformリソース全体の初期化用のmodule。tfstate管理のS3バケット作成など。
└─autn ・・・認証のリソースを作成するmodule
├─kong-apigateway ・・・APIGatewayリソースのmodule
└─observation ・・・オブザーバビリティで使用するストレージ(S3)とアクセス権(IRSA)を作成するmodule

AWS-S3
nautible-dev-plugin-tf-ap-northeast-1 ・・・Terraformを管理するためのS3バケット。バージョニング有効。
│ nautible-dev-plugin.tfstate ・・・Terraformのtfstate
AWS-Dynamodb
└─nautible-dev-plugin-tstate-lock ・・・teffaromのtfstateのlockテーブル
```

各module配下のファイルは記載を割愛
各 module 配下のファイルは記載を割愛

### 環境構築対象のリソース

「terraform plan」で確認してください

### 環境構築の前に

* AWS環境の環境構築のみサポートしています
* Terraformを利用して環境構築を行います
* TerraformのAWS認証は環境変数「AWS_PROFILE」でプロファイルを利用して実行することを想定しています(Terraformの定義ファイルを編集する事で他の方法でも認証可能ですが、SCMへのコミットミスなどに注意が必要です
- AWS 環境の環境構築のみサポートしています
- Terraform を利用して環境構築を行います
- Terraform の AWS 認証は環境変数「AWS_PROFILE」でプロファイルを利用して実行することを想定しています(Terraform の定義ファイルを編集する事で他の方法でも認証可能ですが、SCM へのコミットミスなどに注意が必要です

### 環境構築実行環境事前準備

* sh実行可能環境であること
* [Terraform(cli)のインストール](https://learn.hashicorp.com/tutorials/terraform/install-cli)
* AWSアカウントの作成
* [AWS cliのインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)
* AWS接続要の[cliプロファイル作成](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-profiles.html)
- sh 実行可能環境であること
- [Terraform(cli)のインストール](https://learn.hashicorp.com/tutorials/terraform/install-cli)
- AWS アカウントの作成
- [AWS cli のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)
- AWS 接続要の[cli プロファイル作成](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-profiles.html)

### 環境構築手順

* AWSの接続プロファイルを環境変数に設定する「export AWS_PROFILE=profile_name」
* tfstate管理用のS3バケットの作成(管理者が一度だけ実行。Terraformで作成するのはアンチパターンですが、nautibleを簡単に試せるようにするため用意しています
* plugin/modules/initのmain.tfとvariables.tfをファイル内のコメントを参考に用途にあわせて修正
* plugin/modules/initディレクトリで「terraform init」の実行
* plugin/modules/initディレクトリで「terraform plan」の実行と内容の確認
* plugin/modules/initディレクトリで「terraform apply」の実行
* AWS環境の構築
* plugin/env/devのmain.tfとvariables.tfをファイル内のコメントを参考に用途にあわせて修正
* plugin/env/devディレクトリで「terraform init」の実行
* plugin/env/devディレクトリで「terraform plan」の実行と内容の確認
* plugin/env/devディレクトリで「terraform apply」の実行
- AWS の接続プロファイルを環境変数に設定する「export AWS_PROFILE=profile_name」
- tfstate 管理用の S3 バケットの作成(管理者が一度だけ実行。Terraform で作成するのはアンチパターンですが、nautible を簡単に試せるようにするため用意しています
- plugin/modules/init の main.tf と variables.tf をファイル内のコメントを参考に用途にあわせて修正
- plugin/modules/init ディレクトリで「terraform init」の実行
- plugin/modules/init ディレクトリで「terraform plan」の実行と内容の確認
- plugin/modules/init ディレクトリで「terraform apply」の実行
- AWS 環境の構築
- plugin/env/dev の main.tf と variables.tf をファイル内のコメントを参考に用途にあわせて修正
- plugin/env/dev ディレクトリで「terraform init」の実行
- plugin/env/dev ディレクトリで「terraform plan」の実行と内容の確認
- plugin/env/dev ディレクトリで「terraform apply」の実行

prodの場合はplugin/env/devをprodに読み替えてください
prod の場合は plugin/env/dev を prod に読み替えてください

## バックアップ環境構築手順

terraform destroyによる環境破棄の際にバックアップデータが消えないようにbackupモジュールのみ独立した環境としています
terraform destroy による環境破棄の際にバックアップデータが消えないように backup モジュールのみ独立した環境としています

バックアップ環境の構築手順は[こちら](./modules/backup/README.md)を参照してください。
7 changes: 4 additions & 3 deletions aws/plugin/env/dev/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,10 @@ module "nautible_plugin" {
vpc_id = data.terraform_remote_state.nautible_aws_platform.outputs.vpc.vpc_id
private_subnets = data.terraform_remote_state.nautible_aws_platform.outputs.vpc.private_subnets
}
eks = local.target_eks
auth = var.auth
kong_apigateway = var.kong_apigateway
eks = local.target_eks
auth = var.auth
kong_apigateway = var.kong_apigateway
observation = var.observation
}

data "terraform_remote_state" "nautible_aws_platform" {
Expand Down
13 changes: 10 additions & 3 deletions aws/plugin/env/dev/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ variable "eks" {
# authのvariables。authのpluginを利用する場合は値を設定する
variable "auth" {
description = "auth設定"
# type = string # authを利用しない場合
# default = "" # auth pluginを利用しない場合。
# type = string # auth pluginを利用しない場合
# default = "" # auth pluginを利用しない場合。
type = object({
postgres = object({
engine_version = string
Expand All @@ -63,7 +63,7 @@ variable "auth" {
}

variable "kong_apigateway" {
# type = string # kong-apigatewayを利用しない場合
# type = string # kong-apigateway pluginを利用しない場合
# default = "" # kong-apigateway pluginを利用しない場合。
type = object({
sqs = object({
Expand All @@ -76,3 +76,10 @@ variable "kong_apigateway" {
}
}
}

variable "observation" {
# type = string # observation pluginを利用しない場合。
# default = "" # observation pluginを利用しない場合。
type = string
default = "true"
}
9 changes: 9 additions & 0 deletions aws/plugin/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,12 @@ module "kong-apigateway" {
count = try(var.kong_apigateway, "") != "" ? 1 : 0
message_retention_seconds = var.kong_apigateway.sqs.message_retention_seconds
}

module "observation" {
source = "./modules/observation"
count = try(var.observation, "") != "" ? 1 : 0
pjname = var.pjname
region = var.region
eks_oidc_provider_arns = values(var.eks).*.oidc.provider_arn
oidc = substr(values(var.eks)[0].oidc.provider_arn, 40, -1)
}
65 changes: 65 additions & 0 deletions aws/plugin/modules/observation/loki-iam.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
resource "aws_iam_policy" "loki_bucket_policy" {
name = "${var.pjname}-${var.region}-loki-bucket-policy"

policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging",
]
Resource = [
"arn:aws:s3:::${aws_s3_bucket.loki_chunks_bucket.bucket}/*",
"arn:aws:s3:::${aws_s3_bucket.loki_ruler_bucket.bucket}/*",
"arn:aws:s3:::${aws_s3_bucket.loki_admin_bucket.bucket}/*"
]
},
{
Effect = "Allow",
Action = [
"s3:ListBucket",
]
Resource = [
"arn:aws:s3:::${aws_s3_bucket.loki_chunks_bucket.bucket}",
"arn:aws:s3:::${aws_s3_bucket.loki_ruler_bucket.bucket}",
"arn:aws:s3:::${aws_s3_bucket.loki_admin_bucket.bucket}"
]
}
]
})
}

resource "aws_iam_role" "loki_bucket_role" {
name = "${var.pjname}-loki-bucket-role"

assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = "sts:AssumeRoleWithWebIdentity",
Principal = {
Federated = var.eks_oidc_provider_arns
}
Condition = {
StringEquals = {
"${var.oidc}:sub" = "system:serviceaccount:monitoring:loki-sa",
"${var.oidc}:aud" = "sts.amazonaws.com"

}
}
}
]
})
}

resource "aws_iam_role_policy_attachment" "loki_bucket_policy_attachment" {
role = aws_iam_role.loki_bucket_role.name
policy_arn = aws_iam_policy.loki_bucket_policy.arn
}

Loading