111 lines
3.8 KiB
Markdown
111 lines
3.8 KiB
Markdown
# 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`. |