docs: add Terraform certification notes and tasks

This commit is contained in:
2026-08-04 23:18:47 +02:00
parent 91a1849009
commit 758182a700
53 changed files with 4588 additions and 0 deletions

112
terraform/task-24.md Normal file
View File

@@ -0,0 +1,112 @@
# Assignment
The Nautilus DevOps team needs to store sensitive data securely using AWS Secrets Manager. They need to create a secret with the following specifications:
1) The secret name should be xfusion-secret.
2) The secret value should contain a key-value pair with username: admin and password: Namin123.
3) Use Terraform to create the secret in AWS Secrets Manager.
The Terraform working directory is /home/bob/terraform. Create the main.tf file (do not create a different .tf file) to accomplish this task.
Note: Right-click under the EXPLORER section in VS Code and select Open in Integrated Terminal to launch the terminal.
# Solution
# Secrets Manager — `xfusion-secret`
Terraform solution to create an AWS Secrets Manager secret holding a username/password
key-value pair.
## `main.tf`
```hcl
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.0"
}
}
}
provider "aws" {
region = "us-east-1"
}
resource "aws_secretsmanager_secret" "xfusion" {
name = "xfusion-secret"
}
resource "aws_secretsmanager_secret_version" "xfusion" {
secret_id = aws_secretsmanager_secret.xfusion.id
secret_string = jsonencode({
username = "admin"
password = "Namin123"
})
}
```
## How to run
```bash
cd /home/bob/terraform
terraform init
terraform apply -auto-approve
```
## How it works
Secrets Manager splits a secret into two parts, and Terraform mirrors that with two
resources:
### `aws_secretsmanager_secret`
The **container / metadata** — the named secret itself. It holds the name, optional
description, KMS key, rotation config, and resource policy, but **not** the secret
value.
- **`name = "xfusion-secret"`** — the secret name, exactly as required.
- No KMS key is specified, so Secrets Manager encrypts the value with the AWS-managed
`aws/secretsmanager` key by default — sufficient for the task.
### `aws_secretsmanager_secret_version`
The **actual value**. Secrets are versioned; every value you store is a version, and
one is marked `AWSCURRENT`. This resource writes that current version.
- **`secret_id = aws_secretsmanager_secret.xfusion.id`** — links the version to its
parent secret. Referencing the attribute (not hardcoding) creates the implicit
dependency so the container is created before the version is written into it.
- **`secret_string`** — the payload. The task wants a **key-value pair**, which in
Secrets Manager means a JSON object string. `jsonencode({ username = "admin",
password = "Namin123" })` produces `{"username":"admin","password":"Namin123"}`.
Using `jsonencode` (rather than hand-writing the JSON string) guarantees valid
escaping and is the idiomatic way to store structured secrets — it's also the
format the Secrets Manager console renders as separate key/value rows.
### Why JSON and not two plain values
Secrets Manager stores a single `SecretString` per version. To hold *multiple* fields
(username **and** password), you encode them as one JSON object. That's the standard
pattern and what lets the console and SDKs pull individual keys (e.g. via
`--query SecretString` then JSON parse). Storing raw `admin` / `Namin123` as two
separate things isn't possible — it's one string field, so JSON is the correct
container.
### Sandbox note
Secrets Manager **basic** operations (create secret, store value) are permitted.
Advanced features — automatic **rotation** and **cross-region replication** — are
blocked in these sandboxes, but this task uses neither, so it proceeds without issue.
## Verify
```bash
aws secretsmanager get-secret-value --secret-id xfusion-secret \
--query 'SecretString' --output text
```
Expected — `{"username":"admin","password":"Namin123"}`.