provider "aws" { region = "us-east-1" default_tags { tags = { ProjectName = var.project_name Environment = var.environment } } } # ------------------------------------------------------------------------------------------ # ------------------------------------Common resources-------------------------------------- # ------------------------------------------------------------------------------------------ data "aws_region" "current" {} data "aws_caller_identity" "current" {} # IAM policy for access shared bucket data "aws_iam_policy_document" "bucket_shared_access" { statement { actions = [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:AbortMultipartUpload" ] resources = ["arn:aws:s3:::${var.project_name}-${var.environment}-bucket-shared", "arn:aws:s3:::${var.project_name}-${var.environment}-bucket-shared/*"] effect = "Allow" } } # IAM Policy - Sagemaker S3 access resource "aws_iam_policy" "allow_backet_shared_access" { name = "allow-bucket-shared-access" policy = data.aws_iam_policy_document.bucket_shared_access.json } # SageMaker Domain 用の default execution Role resource "aws_iam_role" "sagemaker_execution_role_default" { name = "sagemaker-execution-role-default" assume_role_policy = data.aws_iam_policy_document.sagemaker_assume_role.json } # IAM policy attach - Sagemaker権限の付与 resource "aws_iam_policy_attachment" "sagemaker_execution_default_role_full_access" { name = "sagemaker-execution-default-role-full-access" roles = [aws_iam_role.sagemaker_execution_role_default.name] policy_arn = "arn:aws:iam::aws:policy/AmazonSageMakerFullAccess" depends_on = [aws_iam_role.sagemaker_execution_role_default] } data "aws_iam_policy_document" "sagemaker_assume_role" { statement { actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["sagemaker.amazonaws.com"] } } } # IAM policy document for access shared CodeCommit data "aws_iam_policy_document" "codecommit_access" { statement { actions = ["codecommit:GitPull", "codecommit:GitPush"] resources = ["arn:aws:codecommit:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:${var.project_name}-${var.environment}-repo"] effect = "Allow" } } # IAM policy for access shared CodeCommit resource "aws_iam_policy" "allow_codecommit_access" { name = "allow-access-codecommit-repository" policy = data.aws_iam_policy_document.codecommit_access.json } # IAM policy document for access shared CodeArtifact data "aws_iam_policy_document" "codecartifact_access" { statement { actions=[ "codeartifact:DescribeDomain", "codeartifact:DescribeRepository", "codeartifact:GetAuthorizationToken", "codeartifact:GetRepositoryEndpoint", "codeartifact:GetRepositoryPermissionsPolicy", "codeartifact:ListPackages", "codeartifact:ListRepositories", "codeartifact:ListTagsForResource", "codeartifact:ReadFromRepository", ] resources = [aws_codeartifact_domain.codeartifact_domain.arn, aws_codeartifact_repository.codeartifact_repository.arn] effect = "Allow" } statement { actions = ["sts:GetServiceBearerToken"] resources = ["*"] condition { test = "StringEquals" variable = "sts:AWSServiceName" values = ["codeartifact.amazonaws.com"] } effect = "Allow" } } # IAM policy for access shared CodeArtifact resource "aws_iam_policy" "allow_codeartifact_access" { name = "allow-access-codeartifact-repository" policy = data.aws_iam_policy_document.codecartifact_access.json } # VPC module "vpc_for_sagemaker" { source = "terraform-aws-modules/vpc/aws" name = "${var.project_name}-${var.environment}-vpc" cidr = "10.0.0.0/16" azs = ["${var.aws_region}a", "${var.aws_region}c"] private_subnets = ["10.0.1.0/24", "10.0.2.0/24"] enable_nat_gateway = false single_nat_gateway = false one_nat_gateway_per_az = false enable_dns_support = true enable_dns_hostnames = true tags = { Name = "${var.project_name}-${var.environment}-vpc" } } # Security Group for VPC endpoint resource "aws_security_group" "allow_local_https" { name = "allow_local_https" description = "Allow HTTPS inbound traffic" vpc_id = module.vpc_for_sagemaker.vpc_id ingress { description = "TLS from VPC" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [module.vpc_for_sagemaker.vpc_cidr_block] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } tags = { Name = "allow_local_https" } } resource "aws_vpc_endpoint" "s3_endpoint" { vpc_id = module.vpc_for_sagemaker.vpc_id service_name = "com.amazonaws.${data.aws_region.current.name}.s3" vpc_endpoint_type = "Gateway" route_table_ids = module.vpc_for_sagemaker.private_route_table_ids policy = < $password = (Get-SECSecretValue -SecretId ${var.project_name}-ec2-login-password-${each.value}).SecretString New-LocalUser -Name user-1 -Password (ConvertTo-SecureString $password -AsPlainText -Force) Add-LocalGroupMember -Group "Remote Desktop Users" -Member user-1 Add-LocalGroupMember -Group Administrators -Member user-1 Write-Output '$url = New-SMPresignedDomainUrl -DomainId ${aws_sagemaker_domain.domain.id} -ExpiresInSecond 30 -UserProfileName sagemaker-user-${each.value} -Region us-east-1' | Set-Content -Encoding Default 'C:\GetPresignedUrl.ps1' Write-Output 'start microsoft-edge:$url' | Add-Content -Encoding Default 'C:\GetPresignedUrl.ps1' true EOF tags = { Name = "ec2-indivisual-${each.value}" } metadata_options { http_endpoint = "enabled" http_tokens = "required" } depends_on = [ aws_secretsmanager_secret.ec2_login_password, aws_secretsmanager_secret_rotation.ec2_login_password_secret_rotation, aws_iam_policy_attachment.ec2_get_secret, aws_secretsmanager_secret_rotation.ec2_login_password_secret_rotation, aws_ebs_encryption_by_default.ebs_encrypt ] } resource "aws_ebs_encryption_by_default" "ebs_encrypt" { enabled = true } # IAM Role SSM利用権限 resource "aws_iam_policy_attachment" "access_session_manager" { name = "access-own-profile" for_each = toset(var.user_list) roles = ["ec2-role-${each.value}"] policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" depends_on = [aws_iam_role.ec2_role_indivisual] } resource "aws_iam_policy_attachment" "ec2_get_secret" { name = "get-login-password" for_each = toset(var.user_list) roles = ["ec2-role-${each.value}"] policy_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:policy/allow-get-${var.project_name}-ec2-login-password-${each.value}" depends_on = [aws_iam_role.ec2_role_indivisual] } # IAM policy - 個人StartSession用 resource "aws_iam_policy" "user_access_only_own_instance" { for_each = toset(var.user_list) name = "user-access-only-own-ec2-${each.value}" policy = <