cat > variables.tf << ‘EOF’
variable “KKE_SNS_TOPIC_NAME” {
description = “Name of the SNS topic”
type = string
default = “”
}
variable “KKE_SSM_PARAM_NAME” {
description = “SSM parameter name”
type = string
default = “”
}
variable “KKE_STEP_FUNCTION_NAME” {
description = “Step Function name”
type = string
default = “”
}
EOF
cat > terraform.tfvars << ‘EOF’
KKE_SNS_TOPIC_NAME = “nautilus-sns-topic”
KKE_SSM_PARAM_NAME = “nautilus-param”
KKE_STEP_FUNCTION_NAME = “nautilus-stepfunction”
EOF
mkdir -p modules/sns modules/ssm modules/stepfunctions
cat > modules/sns/main.tf << ‘EOF’
resource “aws_sns_topic” “this” {
name = var.KKE_SNS_TOPIC_NAME
}
EOF
cat > modules/sns/outputs.tf << ‘EOF’
output “topic_name” {
value = aws_sns_topic.this.name
}
output “topic_arn” {
value = aws_sns_topic.this.arn
}
EOF
cat > modules/ssm/module_vars.tf << ‘EOF’
variable “sns_topic_arn” {
type = string
description = “SNS Topic ARN from SNS module”
}
EOF
cat > modules/ssm/main.tf << ‘EOF’
resource “aws_ssm_parameter” “this” {
name = var.KKE_SSM_PARAM_NAME
type = “String”
value = var.sns_topic_arn
}
EOF
cat > modules/ssm/outputs.tf << ‘EOF’
output “parameter_name” {
value = aws_ssm_parameter.this.name
}
output “parameter_arn” {
value = aws_ssm_parameter.this.arn
}
EOF
cat > modules/stepfunctions/module_vars.tf << ‘EOF’
variable “ssm_parameter_arn” {
type = string
description = “ARN of SSM parameter from data source in root”
}
variable “ssm_parameter_value” {
type = string
description = “Value of SSM parameter from data source in root”
}
EOF
cat > modules/stepfunctions/main.tf << ‘EOF’
resource “aws_iam_role” “step_function_role” {
name = “${var.KKE_STEP_FUNCTION_NAME}-role”
assume_role_policy = jsonencode({
Version = “2012-10-17”
Statement = [{
Action = “sts:AssumeRole”
Effect = “Allow”
Principal = {
Service = “states.amazonaws.com”
}
}]
})
}
resource “aws_iam_role_policy” “step_function_policy” {
name = “${var.KKE_STEP_FUNCTION_NAME}-policy”
role = aws_iam_role.step_function_role.id
policy = jsonencode({
Version = “2012-10-17”
Statement = [{
Effect = “Allow”
Action = [“ssm:GetParameter”]
Resource = var.ssm_parameter_arn
}]
})
}
resource “aws_sfn_state_machine” “this” {
name = var.KKE_STEP_FUNCTION_NAME
role_arn = aws_iam_role.step_function_role.arn
definition = jsonencode({
Comment = “Step Function using SSM parameter”
StartAt = “PassState”
States = {
PassState = {
Type = “Pass”
Result = {
SSMParameterARN = var.ssm_parameter_arn
SSMParameterValue = var.ssm_parameter_value
}
End = true
}
}
})
}
EOF
cat > modules/stepfunctions/outputs.tf << ‘EOF’
output “state_machine_name” {
value = aws_sfn_state_machine.this.name
}
EOF
echo “Checking module files…”
for module in sns ssm stepfunctions; do
if [ ! -f “modules/$module/main.tf” ]; then
echo " ERROR: modules/$module/main.tf not found!"
exit 1
fi
if [ ! -f “modules/$module/outputs.tf” ]; then
echo " ERROR: modules/$module/outputs.tf not found!"
exit 1
fi
done
echo “All module files created”
echo “Creating symlinks…”
rm -f modules/sns/variables.tf modules/ssm/variables.tf modules/stepfunctions/variables.tf
ln -s /home/bob/terraform/variables.tf modules/sns/variables.tf
ln -s /home/bob/terraform/variables.tf modules/ssm/variables.tf
ln -s /home/bob/terraform/variables.tf modules/stepfunctions/variables.tf
echo “Verifying symlinks:”
ls -la modules/*/variables.tf
cat > main.tf << ‘EOF’
module “sns” {
source = “./modules/sns”
KKE_SNS_TOPIC_NAME = var.KKE_SNS_TOPIC_NAME
KKE_SSM_PARAM_NAME = var.KKE_SSM_PARAM_NAME
KKE_STEP_FUNCTION_NAME = var.KKE_STEP_FUNCTION_NAME
}
module “ssm” {
source = “./modules/ssm”
KKE_SNS_TOPIC_NAME = var.KKE_SNS_TOPIC_NAME
KKE_SSM_PARAM_NAME = var.KKE_SSM_PARAM_NAME
KKE_STEP_FUNCTION_NAME = var.KKE_STEP_FUNCTION_NAME
sns_topic_arn = module.sns.topic_arn
depends_on = [module.sns]
}
data “aws_ssm_parameter” “this” {
name = module.ssm.parameter_name
depends_on = [module.ssm]
}
module “stepfunctions” {
source = “./modules/stepfunctions”
KKE_SNS_TOPIC_NAME = var.KKE_SNS_TOPIC_NAME
KKE_SSM_PARAM_NAME = var.KKE_SSM_PARAM_NAME
KKE_STEP_FUNCTION_NAME = var.KKE_STEP_FUNCTION_NAME
ssm_parameter_arn = data.aws_ssm_parameter.this.arn
ssm_parameter_value = data.aws_ssm_parameter.this.value
depends_on = [data.aws_ssm_parameter.this]
}
EOF
============================================================================
7. outputs.tf
============================================================================
cat > outputs.tf << ‘EOF’
output “kke_sns_topic_name” {
value = module.sns.topic_name
}
output “kke_ssm_parameter_name” {
value = module.ssm.parameter_name
}
output “kke_step_function_name” {
value = module.stepfunctions.state_machine_name
}
EOF