docs: add Terraform certification notes and tasks
This commit is contained in:
111
terraform/task-18.md
Normal file
111
terraform/task-18.md
Normal file
@@ -0,0 +1,111 @@
|
||||
# Assignment
|
||||
|
||||
The Nautilus DevOps team needs to create an AWS Kinesis data stream for real-time data processing. This stream will be used to ingest and process large volumes of streaming data, which will then be consumed by various applications for analytics and real-time decision-making.
|
||||
|
||||
The stream should be named xfusion-stream.
|
||||
|
||||
Use Terraform to create this Kinesis stream.
|
||||
|
||||
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.
|
||||
Before submitting the task, ensure that terraform plan returns No changes. Your infrastructure matches the configuration.
|
||||
|
||||
# Solution
|
||||
|
||||
# Kinesis Data Stream — `xfusion-stream`
|
||||
|
||||
Terraform solution to create a provisioned Kinesis data stream with a single shard,
|
||||
configured so `terraform plan` reports no drift after apply.
|
||||
|
||||
## `main.tf`
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = "~> 6.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "aws" {
|
||||
region = "us-east-1"
|
||||
}
|
||||
|
||||
resource "aws_kinesis_stream" "xfusion_stream" {
|
||||
name = "xfusion-stream"
|
||||
shard_count = 1
|
||||
retention_period = 24
|
||||
|
||||
stream_mode_details {
|
||||
stream_mode = "PROVISIONED"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## How to run
|
||||
|
||||
```bash
|
||||
cd /home/bob/terraform
|
||||
terraform init
|
||||
terraform apply -auto-approve
|
||||
|
||||
# Idempotency check required by the task:
|
||||
terraform plan
|
||||
# -> "No changes. Your infrastructure matches the configuration."
|
||||
```
|
||||
|
||||
## How it works
|
||||
|
||||
### `aws_kinesis_stream`
|
||||
|
||||
- **`name = "xfusion-stream"`** — the stream name, exactly as required.
|
||||
|
||||
- **`stream_mode_details { stream_mode = "PROVISIONED" }`** — Kinesis has two
|
||||
capacity modes: `PROVISIONED` (you manage shards) and `ON_DEMAND` (AWS
|
||||
auto-scales). This is set to `PROVISIONED` explicitly. The two modes are mutually
|
||||
exclusive with `shard_count`: `PROVISIONED` **requires** `shard_count`, while
|
||||
`ON_DEMAND` **forbids** it. Getting this pairing wrong is the usual cause of a
|
||||
perpetual non-empty plan or an apply error.
|
||||
|
||||
- **`shard_count = 1`** — one shard. A shard is the base throughput unit (1 MB/s or
|
||||
1000 records/s in, 2 MB/s out). One shard is plenty for a lab and is the
|
||||
provisioned-capacity choice that pairs with `PROVISIONED` mode.
|
||||
|
||||
- **`retention_period = 24`** — hours that records stay in the stream before aging
|
||||
out. `24` is the AWS default and the minimum; setting it explicitly to the default
|
||||
value keeps the resource stable and readable.
|
||||
|
||||
### Why the plan comes back clean
|
||||
|
||||
The task explicitly requires `terraform plan` to report **no changes** after apply.
|
||||
Two things guarantee that here:
|
||||
|
||||
1. **Mode and shard count are consistent.** `PROVISIONED` + an explicit
|
||||
`shard_count` is the stable, non-conflicting combination. Mixing `ON_DEMAND` with
|
||||
a `shard_count`, or omitting the mode and letting it get inferred, is what
|
||||
typically produces a drift diff on the next plan.
|
||||
|
||||
2. **Every value set matches what AWS stores.** `retention_period = 24` equals the
|
||||
service default, and no other arguments (encryption, shard-level metrics) are
|
||||
toggled, so there's nothing for the provider to reconcile on refresh.
|
||||
|
||||
### Sandbox note
|
||||
|
||||
Constrained lab environments cap Kinesis at **PROVISIONED mode, 1 shard per stream,
|
||||
≤24h retention, and ≤2 streams per account**. This config sits inside every one of
|
||||
those limits, so it won't be silently reset or rejected.
|
||||
|
||||
## Verify
|
||||
|
||||
```bash
|
||||
aws kinesis describe-stream-summary --stream-name xfusion-stream \
|
||||
--query 'StreamDescriptionSummary.{Name:StreamName,Status:StreamStatus,Mode:StreamModeDetails.StreamMode,Shards:OpenShardCount,Retention:RetentionPeriodHours}'
|
||||
```
|
||||
|
||||
Expected — name `xfusion-stream`, `StreamStatus: ACTIVE` (a few seconds after
|
||||
create), `StreamMode: PROVISIONED`, `OpenShardCount: 1`, retention `24`.
|
||||
Reference in New Issue
Block a user