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

feat: Support permission init for control plane management volume #104

Merged
merged 33 commits into from
Jan 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
9ffca38
Support permission init
tuteng Dec 23, 2024
41e6788
Support s3 bucket access
tuteng Dec 23, 2024
a2b4989
Fixed example
tuteng Dec 23, 2024
a5929c5
Fixed volume module
tuteng Dec 24, 2024
559eea4
Fixed oidc provider
tuteng Dec 25, 2024
f4dbc20
Format code
tuteng Dec 25, 2024
7d46c0d
Fixed test
tuteng Dec 25, 2024
1778f65
Fixed comment
tuteng Dec 30, 2024
737a5d5
Merge branch 'feature/support-init-sn-volume-access-bak' into feature…
tuteng Dec 30, 2024
56ab268
Fixed providers
tuteng Dec 30, 2024
be99962
Removed no used module
tuteng Dec 30, 2024
9c93682
Fixed volume access
tuteng Dec 30, 2024
144090e
Fixed module
tuteng Dec 30, 2024
3450f86
Update example
tuteng Dec 30, 2024
548adf1
Removed no used file
tuteng Dec 30, 2024
6dac346
Fixed comment
tuteng Dec 31, 2024
c26dca9
Fixed comment
tuteng Dec 31, 2024
9429ef5
Fixed check
tuteng Dec 31, 2024
f05e13a
Fixed comment
tuteng Jan 2, 2025
1169a4e
Add new field
tuteng Jan 2, 2025
53159bc
Fixed comment
tuteng Jan 2, 2025
89841d6
Revert config
tuteng Jan 2, 2025
7e1708a
Fixed condition check
tuteng Jan 2, 2025
b97de86
Fixed comment
tuteng Jan 3, 2025
ab5c8a4
Fixed comment
tuteng Jan 3, 2025
a59d6e3
Fixed main file
tuteng Jan 3, 2025
c849dc1
Fixed assume conditions
tuteng Jan 3, 2025
a9e1dab
Fixed comment
tuteng Jan 3, 2025
58db995
Fixed comment
tuteng Jan 7, 2025
4fa0eb4
Fixed comment
tuteng Jan 7, 2025
4dfb5a6
Fixed cmment
tuteng Jan 8, 2025
a4f1413
Format code
tuteng Jan 8, 2025
0000db7
Add distinc func
tuteng Jan 8, 2025
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
11 changes: 11 additions & 0 deletions examples/volume-access/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module "sn_managed_cloud" {
source = "../../modules/aws/volume-access"
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will change it after this pr approve and merged


external_id = "<your-organization-id>"
role = "<role-name>"
buckets = []

account_ids = []

streamnative_vendor_access_role_arns = []
}
79 changes: 79 additions & 0 deletions modules/aws/volume-access/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
data "aws_caller_identity" "current" {}
locals {
external_id = (var.external_id != "" ? [{ test : "StringEquals", variable : "sts:ExternalId", values : [var.external_id] }] : [])
account_ids = distinct(concat(var.account_ids, local.default_account_ids))
identifiers_list = [for account_id in local.account_ids : "arn:aws:iam::${account_id}:root"]
bucket_list = distinct([for item in var.buckets : "arn:aws:s3:::${split("/", item)[0]}"])
bucket_path_list = distinct([for item in var.buckets : "arn:aws:s3:::${item}"])
tag_set = merge({ Vendor = "StreamNative", Module = "StreamNative Volume", SNVersion = var.sn_policy_version }, var.tags)
default_account_ids = compact([
# will add it in the next pr
])
}

data "aws_iam_policy_document" "streamnative_management_access" {
statement {
sid = "AllowStreamNativeControlPlaneAccess"
effect = "Allow"
actions = ["sts:AssumeRole"]

principals {
type = "AWS"
identifiers = distinct(concat(var.streamnative_vendor_access_role_arns, local.identifiers_list))
}
dynamic "condition" {
for_each = local.external_id
content {
test = condition.value["test"]
values = condition.value["values"]
variable = condition.value["variable"]
}
}
}
}

######
#-- Create the IAM role for the the StreamNative Cloud data plane access to s3 bucket
######
resource "aws_iam_role_policy" "access_bucket_role" {
name = var.role
role = aws_iam_role.access_bucket_role.id
policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : [
"s3:ListBucket"
],
"Resource" : local.bucket_list
},
{
"Effect" : "Allow",
"Action" : [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource" : [for item in local.bucket_path_list : "${item}/*"]
},
{
"Effect" : "Allow",
"Action" : [
"s3:PutLifecycleConfiguration",
"s3:GetLifecycleConfiguration"
],
"Resource" : local.bucket_path_list
}
]
})
}

resource "aws_iam_role" "access_bucket_role" {
name = var.role
description = "This role is used by StreamNative for the access s3 bucket."
assume_role_policy = data.aws_iam_policy_document.streamnative_management_access.json
path = "/StreamNative/"
tags = local.tag_set
max_session_duration = 43200
}
40 changes: 40 additions & 0 deletions modules/aws/volume-access/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
variable "sn_policy_version" {
description = "The value of SNVersion tag"
default = "3.16.1" # {{ x-release-please-version }}
type = string
}

variable "streamnative_vendor_access_role_arns" {
default = ["arn:aws:iam::311022431024:role/cloud-manager"]
description = "This role for access customer s3 bucket on control plane."
type = list(string)
}

variable "external_id" {
default = ""
description = "A external ID that correspond to your Organization within StreamNative Cloud, used for all STS assume role calls to the IAM roles created by the module. This will be the organization ID in the StreamNative console, e.g. \"o-xhopj\"."
type = string
}

variable "tags" {
default = {}
description = "Extra tags to apply to the resources created by this module."
type = map(string)
}

variable "buckets" {
default = []
description = "User bucket and path name"
type = list(string)
}

variable "role" {
description = "Your aws iam role for access s3 bucket"
type = string
}

variable "account_ids" {
default = []
description = "Your account id"
type = list(string)
}
10 changes: 10 additions & 0 deletions modules/aws/volume-access/versions.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
terraform {
required_version = ">= 1.0"

required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 5.30"
}
}
}
Loading