From b7a6dfdfdc1594094263b218a215c524f4ad2afe Mon Sep 17 00:00:00 2001 From: Alina Bondarenko Date: Tue, 3 Feb 2026 13:33:19 +0200 Subject: [PATCH] Solution --- .gitignore | 1 + main.tf | 42 ++++++++++++++++++++++++++++++++++++++++-- outputs.tf | 4 ++-- terraform.tfvars | 2 +- tfplan | Bin 0 -> 4106 bytes tfplan.json | 1 + variables.tf | 4 ++-- 7 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 tfplan create mode 100644 tfplan.json diff --git a/.gitignore b/.gitignore index 8b58a40..7c812ee 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ terraform.tfstate terraform.tfstate.backup tfPlan +terraform.tfvars diff --git a/main.tf b/main.tf index fc60f38..6ea5538 100644 --- a/main.tf +++ b/main.tf @@ -1,3 +1,41 @@ -# 1. Deploy an S3 storage bucket +resource "aws_s3_bucket" "grafana_backups" { + bucket = "aws-devops-task-6-deploy-storage-bucket" +} -# 2. Confugure bucket policy to allow grafana iam role to use storage +data "aws_iam_policy_document" "grafana_backups_policy" { + + statement { + sid = "AllowListBucket" + effect = "Allow" + + principals { + type = "AWS" + identifiers = [var.grafana_iam_role_arn] + } + + actions = ["s3:ListBucket"] + resources = [aws_s3_bucket.grafana_backups.arn] + } + + statement { + sid = "AllowGetPutObjects" + effect = "Allow" + + principals { + type = "AWS" + identifiers = [var.grafana_iam_role_arn] + } + + actions = [ + "s3:GetObject", + "s3:PutObject" + ] + + resources = ["${aws_s3_bucket.grafana_backups.arn}/*"] + } +} + +resource "aws_s3_bucket_policy" "grafana_backups_policy" { + bucket = aws_s3_bucket.grafana_backups.id + policy = data.aws_iam_policy_document.grafana_backups_policy.json +} diff --git a/outputs.tf b/outputs.tf index df85631..155847c 100644 --- a/outputs.tf +++ b/outputs.tf @@ -1,4 +1,4 @@ output "bucket_name" { - value = aws_s3_bucket.grafana_backups.bucket - sensitive = false + value = aws_s3_bucket.grafana_backups.bucket + sensitive = false } diff --git a/terraform.tfvars b/terraform.tfvars index 7f7bb12..a157d0c 100644 --- a/terraform.tfvars +++ b/terraform.tfvars @@ -1 +1 @@ -grafana_iam_role_arn = "" +grafana_iam_role_arn = "arn:aws:iam::856108750634:role/GrafanaEC2Role" diff --git a/tfplan b/tfplan new file mode 100644 index 0000000000000000000000000000000000000000..903c8982618003a99aa64425c793e14672da8d5c GIT binary patch literal 4106 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 L=#$?KvYq`8cLazY literal 0 HcmV?d00001 diff --git a/tfplan.json b/tfplan.json new file mode 100644 index 0000000..6060e91 --- /dev/null +++ b/tfplan.json @@ -0,0 +1 @@ +{"format_version":"1.2","terraform_version":"1.13.3","variables":{"grafana_iam_role_arn":{"value":"arn:aws:iam::856108750634:role/GrafanaEC2Role"}},"planned_values":{"outputs":{"bucket_name":{"sensitive":false,"type":"string","value":"aws-devops-task-6-deploy-storage-bucket"}},"root_module":{"resources":[{"address":"aws_s3_bucket.grafana_backups","mode":"managed","type":"aws_s3_bucket","name":"grafana_backups","provider_name":"registry.terraform.io/hashicorp/aws","schema_version":0,"values":{"bucket":"aws-devops-task-6-deploy-storage-bucket","force_destroy":false,"tags":null,"timeouts":null},"sensitive_values":{"cors_rule":[],"grant":[],"lifecycle_rule":[],"logging":[],"object_lock_configuration":[],"replication_configuration":[],"server_side_encryption_configuration":[],"tags_all":{},"versioning":[],"website":[]}},{"address":"aws_s3_bucket_policy.grafana_backups_policy","mode":"managed","type":"aws_s3_bucket_policy","name":"grafana_backups_policy","provider_name":"registry.terraform.io/hashicorp/aws","schema_version":0,"sensitive_values":{}},{"address":"data.aws_iam_policy_document.grafana_backups_policy","mode":"data","type":"aws_iam_policy_document","name":"grafana_backups_policy","provider_name":"registry.terraform.io/hashicorp/aws","schema_version":0,"values":{"override_json":null,"override_policy_documents":null,"policy_id":null,"source_json":null,"source_policy_documents":null,"statement":[{"actions":["s3:ListBucket"],"condition":[],"effect":"Allow","not_actions":null,"not_principals":[],"not_resources":null,"principals":[{"identifiers":["arn:aws:iam::856108750634:role/GrafanaEC2Role"],"type":"AWS"}],"resources":[null],"sid":"AllowListBucket"},{"actions":["s3:GetObject","s3:PutObject"],"condition":[],"effect":"Allow","not_actions":null,"not_principals":[],"not_resources":null,"principals":[{"identifiers":["arn:aws:iam::856108750634:role/GrafanaEC2Role"],"type":"AWS"}],"resources":[null],"sid":"AllowGetPutObjects"}],"version":null},"sensitive_values":{"statement":[{"actions":[false],"condition":[],"not_principals":[],"principals":[{"identifiers":[false]}],"resources":[false]},{"actions":[false,false],"condition":[],"not_principals":[],"principals":[{"identifiers":[false]}],"resources":[false]}]}}]}},"resource_changes":[{"address":"data.aws_iam_policy_document.grafana_backups_policy","mode":"data","type":"aws_iam_policy_document","name":"grafana_backups_policy","provider_name":"registry.terraform.io/hashicorp/aws","change":{"actions":["read"],"before":null,"after":{"override_json":null,"override_policy_documents":null,"policy_id":null,"source_json":null,"source_policy_documents":null,"statement":[{"actions":["s3:ListBucket"],"condition":[],"effect":"Allow","not_actions":null,"not_principals":[],"not_resources":null,"principals":[{"identifiers":["arn:aws:iam::856108750634:role/GrafanaEC2Role"],"type":"AWS"}],"resources":[null],"sid":"AllowListBucket"},{"actions":["s3:GetObject","s3:PutObject"],"condition":[],"effect":"Allow","not_actions":null,"not_principals":[],"not_resources":null,"principals":[{"identifiers":["arn:aws:iam::856108750634:role/GrafanaEC2Role"],"type":"AWS"}],"resources":[null],"sid":"AllowGetPutObjects"}],"version":null},"after_unknown":{"id":true,"json":true,"minified_json":true,"statement":[{"actions":[false],"condition":[],"not_principals":[],"principals":[{"identifiers":[false]}],"resources":[true]},{"actions":[false,false],"condition":[],"not_principals":[],"principals":[{"identifiers":[false]}],"resources":[true]}]},"before_sensitive":false,"after_sensitive":{"statement":[{"actions":[false],"condition":[],"not_principals":[],"principals":[{"identifiers":[false]}],"resources":[false]},{"actions":[false,false],"condition":[],"not_principals":[],"principals":[{"identifiers":[false]}],"resources":[false]}]}},"action_reason":"read_because_config_unknown"},{"address":"aws_s3_bucket.grafana_backups","mode":"managed","type":"aws_s3_bucket","name":"grafana_backups","provider_name":"registry.terraform.io/hashicorp/aws","change":{"actions":["create"],"before":null,"after":{"bucket":"aws-devops-task-6-deploy-storage-bucket","force_destroy":false,"tags":null,"timeouts":null},"after_unknown":{"acceleration_status":true,"acl":true,"arn":true,"bucket_domain_name":true,"bucket_prefix":true,"bucket_regional_domain_name":true,"cors_rule":true,"grant":true,"hosted_zone_id":true,"id":true,"lifecycle_rule":true,"logging":true,"object_lock_configuration":true,"object_lock_enabled":true,"policy":true,"region":true,"replication_configuration":true,"request_payer":true,"server_side_encryption_configuration":true,"tags_all":true,"versioning":true,"website":true,"website_domain":true,"website_endpoint":true},"before_sensitive":false,"after_sensitive":{"cors_rule":[],"grant":[],"lifecycle_rule":[],"logging":[],"object_lock_configuration":[],"replication_configuration":[],"server_side_encryption_configuration":[],"tags_all":{},"versioning":[],"website":[]}}},{"address":"aws_s3_bucket_policy.grafana_backups_policy","mode":"managed","type":"aws_s3_bucket_policy","name":"grafana_backups_policy","provider_name":"registry.terraform.io/hashicorp/aws","change":{"actions":["create"],"before":null,"after":{},"after_unknown":{"bucket":true,"id":true,"policy":true},"before_sensitive":false,"after_sensitive":{}}}],"output_changes":{"bucket_name":{"actions":["create"],"before":null,"after":"aws-devops-task-6-deploy-storage-bucket","after_unknown":false,"before_sensitive":false,"after_sensitive":false}},"prior_state":{"format_version":"1.0","terraform_version":"1.13.3","values":{"outputs":{"bucket_name":{"sensitive":false,"value":"aws-devops-task-6-deploy-storage-bucket","type":"string"}},"root_module":{}}},"configuration":{"provider_config":{"aws":{"name":"aws","full_name":"registry.terraform.io/hashicorp/aws","version_constraint":"~\u003e 5.0"}},"root_module":{"outputs":{"bucket_name":{"expression":{"references":["aws_s3_bucket.grafana_backups.bucket","aws_s3_bucket.grafana_backups"]}}},"resources":[{"address":"aws_s3_bucket.grafana_backups","mode":"managed","type":"aws_s3_bucket","name":"grafana_backups","provider_config_key":"aws","expressions":{"bucket":{"constant_value":"aws-devops-task-6-deploy-storage-bucket"}},"schema_version":0},{"address":"aws_s3_bucket_policy.grafana_backups_policy","mode":"managed","type":"aws_s3_bucket_policy","name":"grafana_backups_policy","provider_config_key":"aws","expressions":{"bucket":{"references":["aws_s3_bucket.grafana_backups.id","aws_s3_bucket.grafana_backups"]},"policy":{"references":["data.aws_iam_policy_document.grafana_backups_policy.json","data.aws_iam_policy_document.grafana_backups_policy"]}},"schema_version":0},{"address":"data.aws_iam_policy_document.grafana_backups_policy","mode":"data","type":"aws_iam_policy_document","name":"grafana_backups_policy","provider_config_key":"aws","expressions":{"statement":[{"actions":{"constant_value":["s3:ListBucket"]},"effect":{"constant_value":"Allow"},"principals":[{"identifiers":{"references":["var.grafana_iam_role_arn"]},"type":{"constant_value":"AWS"}}],"resources":{"references":["aws_s3_bucket.grafana_backups.arn","aws_s3_bucket.grafana_backups"]},"sid":{"constant_value":"AllowListBucket"}},{"actions":{"constant_value":["s3:GetObject","s3:PutObject"]},"effect":{"constant_value":"Allow"},"principals":[{"identifiers":{"references":["var.grafana_iam_role_arn"]},"type":{"constant_value":"AWS"}}],"resources":{"references":["aws_s3_bucket.grafana_backups.arn","aws_s3_bucket.grafana_backups"]},"sid":{"constant_value":"AllowGetPutObjects"}}]},"schema_version":0}],"variables":{"grafana_iam_role_arn":{}}}},"relevant_attributes":[{"resource":"data.aws_iam_policy_document.grafana_backups_policy","attribute":["json"]},{"resource":"aws_s3_bucket.grafana_backups","attribute":["arn"]},{"resource":"aws_s3_bucket.grafana_backups","attribute":["bucket"]},{"resource":"aws_s3_bucket.grafana_backups","attribute":["id"]}],"timestamp":"2026-02-03T11:22:56Z","applyable":true,"complete":true,"errored":false} diff --git a/variables.tf b/variables.tf index cea62a6..17fc6c5 100644 --- a/variables.tf +++ b/variables.tf @@ -1,4 +1,4 @@ variable "grafana_iam_role_arn" { - type = string - description = "" + type = string + description = "" }