diff --git a/Makefile b/Makefile index affb4f3..15f1d75 100644 --- a/Makefile +++ b/Makefile @@ -77,7 +77,7 @@ test: _pull-tf echo "------------------------------------------------------------"; \ echo "# Terraform init"; \ echo "------------------------------------------------------------"; \ - if docker run $$(tty -s && echo "-it" || echo) --rm -v "$(CURRENT_DIR):/t" --workdir "$${DOCKER_PATH}" hashicorp/terraform:$(TF_VERSION) \ + if docker run $$(tty -s && echo "-it" || echo) --rm --network host -v "$(CURRENT_DIR):/t" --workdir "$${DOCKER_PATH}" hashicorp/terraform:$(TF_VERSION) \ init \ -lock=false \ -upgrade \ diff --git a/README.md b/README.md index da64134..11fc28a 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,10 @@ -# terraform-module-template -Template for Terraform modules - - +# terraform-aws-bedrock + +Module to create Amazon Bedrock custom model + +[![lint](https://github.com/flaconi/terraform-aws-bedrock/workflows/lint/badge.svg)](https://github.com/flaconi/terraform-aws-bedrock/actions?query=workflow%3Alint) +[![test](https://github.com/flaconi/terraform-aws-bedrock/workflows/test/badge.svg)](https://github.com/flaconi/terraform-aws-bedrock/actions?query=workflow%3Atest) +[![Tag](https://img.shields.io/github/tag/flaconi/terraform-aws-bedrock.svg)](https://github.com/flaconi/terraform-aws-bedrock/releases) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT) For requirements regarding module structure: [style-guide-terraform.md](https://github.com/Flaconi/devops-docs/blob/master/doc/conventions/style-guide-terraform.md) @@ -18,7 +17,9 @@ For requirements regarding module structure: [style-guide-terraform.md](https:// ## Providers -No providers. +| Name | Version | +|------|---------| +| [aws](#provider\_aws) | ~> 5.73 | @@ -28,24 +29,121 @@ No providers. | Name | Version | |------|---------| | [terraform](#requirement\_terraform) | ~> 1.3 | +| [aws](#requirement\_aws) | ~> 5.73 | ## Required Inputs -No required inputs. +The following input variables are required: + +### [name](#input\_name) + +Description: Name for the custom model. + +Type: `string` + +### [job\_name](#input\_job\_name) + +Description: A name for the customization job. + +Type: `string` + +### [model\_role\_arn](#input\_model\_role\_arn) + +Description: The Amazon Resource Name (ARN) of an IAM role that Bedrock can assume to perform tasks on your behalf. + +Type: `string` + +### [output\_data\_s3\_uri](#input\_output\_data\_s3\_uri) + +Description: The S3 URI where the output data is stored. + +Type: `string` + +### [training\_data\_s3\_uri](#input\_training\_data\_s3\_uri) + +Description: The S3 URI where the training data is stored. + +Type: `string` ## Optional Inputs -No optional inputs. +The following input variables are optional (have default values): + +### [foundation\_model\_id](#input\_foundation\_model\_id) + +Description: Model identifier. + +Type: `string` + +Default: `"amazon.titan-text-express-v1"` + +### [model\_kms\_key\_id](#input\_model\_kms\_key\_id) + +Description: The custom model is encrypted at rest using this key. Specify the key ARN. + +Type: `string` + +Default: `null` + +### [model\_customization\_type](#input\_model\_customization\_type) + +Description: The customization type. Valid values: `FINE_TUNING`, `CONTINUED_PRE_TRAINING`. + +Type: `string` + +Default: `null` + +### [model\_hyperparameters](#input\_model\_hyperparameters) + +Description: Parameters related to tuning the model. + +Type: `map(string)` + +Default: `{}` + +### [validation\_data\_s3\_uri](#input\_validation\_data\_s3\_uri) + +Description: The S3 URI where the validation data is stored. + +Type: `string` + +Default: `null` + +### [vpc\_config](#input\_vpc\_config) + +Description: Configuration parameters for the private Virtual Private Cloud (VPC) that contains the resources you are using for this job. + +Type: + +```hcl +object({ + security_group_ids = list(string) + subnet_ids = list(string) + }) +``` + +Default: `null` + +### [tags](#input\_tags) + +Description: A map of tags to assign to the customization job and custom model. + +Type: `map(string)` + +Default: `{}` ## Outputs -No outputs. +| Name | Description | +|------|-------------| +| [custom\_model\_arn](#output\_custom\_model\_arn) | The ARN of the output model. | +| [job\_arn](#output\_job\_arn) | The ARN of the customization job. | @@ -53,4 +151,4 @@ No outputs. **[MIT License](LICENSE)** -Copyright (c) 2023 **[Flaconi GmbH](https://github.com/flaconi)** +Copyright (c) 2024 **[Flaconi GmbH](https://github.com/flaconi)** diff --git a/data.tf b/data.tf new file mode 100644 index 0000000..02dcde6 --- /dev/null +++ b/data.tf @@ -0,0 +1,3 @@ +data "aws_bedrock_foundation_model" "this" { + model_id = var.foundation_model_id +} diff --git a/examples/titan/README.md b/examples/titan/README.md new file mode 100644 index 0000000..0badb4b --- /dev/null +++ b/examples/titan/README.md @@ -0,0 +1,36 @@ +# Example + + +## Requirements + +| Name | Version | +|------|---------| +| [terraform](#requirement\_terraform) | >= 1.3 | +| [aws](#requirement\_aws) | ~> 5.73 | + +## Providers + +No providers. + +## Modules + +| Name | Source | Version | +|------|--------|---------| +| [model](#module\_model) | ../../ | n/a | + +## Resources + +No resources. + +## Inputs + +No inputs. + +## Outputs + +| Name | Description | +|------|-------------| +| [custom\_model\_arn](#output\_custom\_model\_arn) | The ARN of the output model. | +| [job\_arn](#output\_job\_arn) | The ARN of the customization job. | + + diff --git a/examples/titan/main.tf b/examples/titan/main.tf new file mode 100644 index 0000000..7e08c28 --- /dev/null +++ b/examples/titan/main.tf @@ -0,0 +1,28 @@ +module "model" { + source = "../../" + + name = "titan" + job_name = "titan-job-1" + foundation_model_id = "amazon.titan-text-express-v1" + model_role_arn = "arn:aws:iam::123456789101:role/TitanModelRole" + + model_hyperparameters = { + "epochCount" = "1" + "batchSize" = "1" + "learningRate" = "0.005" + "learningRateWarmupSteps" = "0" + } + + output_data_s3_uri = "s3://titan-output-data/data/" + training_data_s3_uri = "s3://titan-training-data/data/train.jsonl" +} + +output "custom_model_arn" { + description = "The ARN of the output model." + value = module.model.custom_model_arn +} + +output "job_arn" { + description = "The ARN of the customization job." + value = module.model.job_arn +} diff --git a/examples/titan/versions.tf b/examples/titan/versions.tf new file mode 100644 index 0000000..74007d0 --- /dev/null +++ b/examples/titan/versions.tf @@ -0,0 +1,9 @@ +terraform { + required_version = ">= 1.3" + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.73" + } + } +} diff --git a/main.tf b/main.tf new file mode 100644 index 0000000..3425718 --- /dev/null +++ b/main.tf @@ -0,0 +1,37 @@ +resource "aws_bedrock_custom_model" "this" { + custom_model_name = var.name + job_name = var.job_name + + base_model_identifier = data.aws_bedrock_foundation_model.this.model_arn + custom_model_kms_key_id = var.model_kms_key_id + customization_type = var.model_customization_type + hyperparameters = var.model_hyperparameters + role_arn = var.model_role_arn + + output_data_config { + s3_uri = var.output_data_s3_uri + } + + training_data_config { + s3_uri = var.training_data_s3_uri + } + + dynamic "validation_data_config" { + for_each = var.validation_data_s3_uri != null ? ["this"] : [] + content { + validator { + s3_uri = var.validation_data_s3_uri + } + } + } + + dynamic "vpc_config" { + for_each = var.vpc_config != null ? ["this"] : [] + content { + security_group_ids = var.vpc_config["security_group_ids"] + subnet_ids = var.vpc_config["subnet_ids"] + } + } + + tags = var.tags +} diff --git a/outputs.tf b/outputs.tf new file mode 100644 index 0000000..735f8a9 --- /dev/null +++ b/outputs.tf @@ -0,0 +1,9 @@ +output "custom_model_arn" { + description = "The ARN of the output model." + value = aws_bedrock_custom_model.this.custom_model_arn +} + +output "job_arn" { + description = "The ARN of the customization job." + value = aws_bedrock_custom_model.this.job_arn +} diff --git a/variables.tf b/variables.tf new file mode 100644 index 0000000..69eb882 --- /dev/null +++ b/variables.tf @@ -0,0 +1,69 @@ +variable "name" { + description = "Name for the custom model." + type = string +} + +variable "job_name" { + description = "A name for the customization job." + type = string +} + +variable "foundation_model_id" { + description = "Model identifier." + type = string + default = "amazon.titan-text-express-v1" +} + +variable "model_kms_key_id" { + description = "The custom model is encrypted at rest using this key. Specify the key ARN." + type = string + default = null +} + +variable "model_customization_type" { + description = "The customization type. Valid values: `FINE_TUNING`, `CONTINUED_PRE_TRAINING`." + type = string + default = null +} + +variable "model_hyperparameters" { + description = "Parameters related to tuning the model." + type = map(string) + default = {} +} + +variable "model_role_arn" { + description = "The Amazon Resource Name (ARN) of an IAM role that Bedrock can assume to perform tasks on your behalf." + type = string +} + +variable "output_data_s3_uri" { + description = "The S3 URI where the output data is stored." + type = string +} + +variable "training_data_s3_uri" { + description = "The S3 URI where the training data is stored." + type = string +} + +variable "validation_data_s3_uri" { + description = "The S3 URI where the validation data is stored." + type = string + default = null +} + +variable "vpc_config" { + description = "Configuration parameters for the private Virtual Private Cloud (VPC) that contains the resources you are using for this job." + type = object({ + security_group_ids = list(string) + subnet_ids = list(string) + }) + default = null +} + +variable "tags" { + description = "A map of tags to assign to the customization job and custom model." + type = map(string) + default = {} +} diff --git a/versions.tf b/versions.tf index e6b4cbd..c06253b 100644 --- a/versions.tf +++ b/versions.tf @@ -1,3 +1,9 @@ terraform { required_version = "~> 1.3" + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.73" + } + } }