2023年5月21日日曜日

S3 クロスリージョンレプリケーション(Terrafrom)

 

teerraformにて、東京リージョン、大阪リージョンにて、
S3 クロスリージョンレプリケーションの記載を行なってみる。



◾️構成図









以下、terraformで、S3 クロスレプリケーションの記載方法になる。

provider "aws" {
region = "ap-northeast-1"
}

provider "aws" {
alias = "osaka"
region = "ap-northeast-3"
}


######################################
# Iam(aws_iam_role_policy_attachment)
#######################################
resource "aws_iam_role_policy_attachment" "replication" {
role = aws_iam_role.replication.name
policy_arn = aws_iam_policy.replication.arn
}

######################################
# Iam(aws_iam_role)
#######################################
resource "aws_iam_role" "replication" {
name = "tf-iam-role-replication-12345"
assume_role_policy = data.aws_iam_policy_document.assume_role.json
}

data "aws_iam_policy_document" "assume_role" {
statement {
effect = "Allow"
principals {
type = "Service"
identifiers = ["s3.amazonaws.com"]
}
actions = ["sts:AssumeRole"]
}
}

#######################################
# Iam(aws_iam_policy)
#######################################
resource "aws_iam_policy" "replication" {
name = "tf-iam-role-policy-replication-12345"
policy = data.aws_iam_policy_document.replication.json
}

data "aws_iam_policy_document" "replication" {
statement {
effect = "Allow"
actions = [
"s3:ListBucket",
"s3:GetReplicationConfiguration",
"s3:GetObjectVersionForReplication",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTagging",
"s3:GetObjectRetention",
"s3:GetObjectLegalHold"
]
resources = [
"${aws_s3_bucket.source.arn}",
"${aws_s3_bucket.destination.arn}",
"${aws_s3_bucket.source.arn}/*",
"${aws_s3_bucket.destination.arn}/*"
]
}
statement {
effect = "Allow"
actions = [
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags",
"s3:ObjectOwnerOverrideToBucketOwner",
]
resources = [
"${aws_s3_bucket.destination.arn}/*",
"${aws_s3_bucket.source.arn}/*"
]
}
}


#########################################
# S3(aws_s3_bucket)destination
#########################################
resource "aws_s3_bucket" "destination" {
bucket = "tf-test-bucket-destination-tokyo"
}

##########################################
# S3(aws_s3_bucket_versioning)destination
##########################################
resource "aws_s3_bucket_versioning" "destination" {
bucket = aws_s3_bucket.destination.id
versioning_configuration {
status = "Enabled"
}
}


#####################################################
# S3(aws_s3_bucket_replication_configuration)destination
#####################################################
resource "aws_s3_bucket_replication_configuration" "destination" {
depends_on = [aws_s3_bucket_versioning.destination]
role = aws_iam_role.replication.arn
bucket = aws_s3_bucket.destination.id
rule {
id = "foobar2"
status = "Enabled"
filter {
prefix = ""
}
delete_marker_replication {
status = "Enabled"
}
destination {
bucket = aws_s3_bucket.source.arn
storage_class = "STANDARD"
replication_time {
status = "Enabled"
time {
minutes = 15
}
}
metrics {
event_threshold {
minutes = 15
}
status = "Enabled"
}
}
}
}


#######################################
# S3(aws_s3_bucket)Source
#######################################
resource "aws_s3_bucket" "source" {
provider = aws.osaka
bucket = "tf-test-bucket-source-osaka"
}

########################################
# S3(aws_s3_bucket_versioning)Sorce
########################################
resource "aws_s3_bucket_versioning" "source" {
provider = aws.osaka
bucket = aws_s3_bucket.source.id
versioning_configuration {
status = "Enabled"
}
}


#####################################################
# S3(aws_s3_bucket_replication_configuration)source
#####################################################
resource "aws_s3_bucket_replication_configuration" "source" {
provider = aws.osaka
depends_on = [aws_s3_bucket_versioning.source]
role = aws_iam_role.replication.arn
bucket = aws_s3_bucket.source.id
rule {
id = "foobar"
status = "Enabled"
filter {
prefix = ""
}
delete_marker_replication {
status = "Enabled"
}
destination {
bucket = aws_s3_bucket.destination.arn
storage_class = "STANDARD"
replication_time {
status = "Enabled"
time {
minutes = 15
}
}
metrics {
event_threshold {
minutes = 15
}
status = "Enabled"
}
}
}
}

#####################################################
# aws_s3control_multi_region_access_point
#####################################################
resource "aws_s3control_multi_region_access_point" "example" {
details {
name = "example"

region {
bucket = aws_s3_bucket.destination.id
}

region {
bucket = aws_s3_bucket.source.id
}
}
}



2023年5月6日土曜日

terraform(Moduleでの変数の書き方)

moduleで変数を定義する方法を模索してみる。 


1)以下、モジュールに赤枠のように変数を定義する



















2)モジュール用にvariables.tf(変数用に定義するファイル)を作成する
上記のモジュールで定義した変数の記載を行う


















3)次にモジュールの参照先のリソースファイルvariable.tfに変数を記載する
以下、記述内容は、上記で作成した変数を参照する記載する記載となっている
(変数に記載が無いが、モジュール用に作成した変数が入っている)






4)リソースファイル用に記載した変数を以下のresourseに反映させる



2023年5月5日金曜日

terraform(Error: creating EC2 Instance: Unsupported: Your requested instance type (t2.micro) is not supported in your requested Availability Zone (ap-northeast-3c).)

terraformで東京、大阪リージョンで Availability Zone毎にEC2(合計6台)を立ち上げた記載を行なって、実施にデプロイを行なってみると以下のエラーが表示される







要は、ap-northeast-3bとap-northeast-3cにt2.microのEC2が作成できないという事らしい
念の為、大阪リージョンのEC2のマネコンで、ap-northeast-3cにてt2.microのEC2を作成しようと思ったら、以下の表示が出て作成出来ずだった。










ちなみに、t3.microでは問題なく作成された

terraform(マルチリージョン)の作成方法について(EC2とEBSを複数作成編)

東京、大阪リージョンにEC2を2台とEBSをそれぞれのEC2に追加する記載を行ってみた。


手順:
1)EC2のresourceの作成を行う際にcountを忘れずに
2)output作成時に、以下のaws_instance.ec2.*.idと記載して全ての情報を出力にする








3)EBSの作成については、以下のようにcountと[count.index]の記述を忘れずに記載



terraform(マルチリージョン)の作成方法について

 東京、大阪リージョンにEC2を作成する記載を行ってみました。


手順:

1)providerを東京、大阪を記載する
2)aliasを記載する
3)moduleで作成する場合、ami情報を正しく読み取ることが出来たので、provider情報を
記載しておく



















4)EBSなどのavaiability情報を記載する場合、大阪リージョン側で作成ができない現象が起こったので、以下のようにprovider情報を記載を行う。






2023年5月2日火曜日

terraform(count.index + 1)

count.index + 1を使ったお試し書きを記載する
以下のタグ名にインスタンス名にナンバリングの記述を行う












実際にterraform applyを行なってみると以下の結果になる。






EFS(Dockerfile)の記載について注意

  Dockerfileにefsのマウントパス宛に、ファイルコピーを行うと ECSのサービス作成時に、コンテナのデプロイ失敗に(container run time error)になるので 別経由で、EFSにファイルをコピーした方が良い!! <Dockerfile> ...