Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,4 @@
terraform.auto.tfvars
backend.tf
.sshkey.pem
Makefile

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/bin/bash

while getopts i: flag
do
case "${flag}" in
i) PublicIp=${OPTARG};;
esac
done

aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" "Name=network-interface.association.public-ip,Values=$PublicIp" \
--query "Reservations[].Instances[].[InstanceId,Tags[?Key=='Name'].Value|[0]]" \
--output table
AgentId=$(aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" "Name=network-interface.association.public-ip,Values=$PublicIp" --query "Reservations[].Instances[].[InstanceId,Tags[?Key=='Name'].Value|[0]]" --output json | jq .[0][0] --raw-output)
aws ssm start-session \
--target $AgentId
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
SHELL := /bin/bash

aws: install all

all: init apply ssh output

clean: state destroy

install:
ifeq ($(shell grep "^ID=" /etc/*elease | cut -d "=" -f 2| sed -e 's/^"//' -e 's/"$$//' 2> /dev/null), amzn)
ifeq ($(shell command -v terraform 2> /dev/null),)
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
sudo yum -y install terraform
endif
endif

version:
time terraform version

init:
time terraform init

validate:
time terraform validate

update:
time terraform get -update

plan:
time terraform plan

apply:
time terraform apply -auto-approve

destroy:
time terraform destroy -auto-approve

output:
time terraform output

ssh:
time terraform output SshKey | tail -n +3 | head -n-3 | sed "s/^[ \t]*//" > .sshkey.pem

state:
time terraform state list

connect: connect-app

connect-app:
chmod +x ./CloudShell/connect.sh
./CloudShell/connect.sh -i $$(terraform output -json App | jq -r .eth0.eip.public_ip)

connect-agent1:
chmod +x ./CloudShell/connect.sh
./CloudShell/connect.sh -i $$(terraform output -json Agent1 | jq -r .eth0.eip.public_ip)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# BPS-on-AWS-1-App-1-Agent-1-VPC-1-Public-Subnet-1-Private-Subnet
# BPS-on-AWS-1-App-1-Virtual-Blade-1-VPC-1-Public-Subnet-1-Private-Subnet

## Description
This deployment creates a topology with a single virtual private cloud having a single public facing subnet and a single private subnet.
Expand All @@ -23,4 +23,4 @@ terraform validate
terraform plan
terraform state list
terraform output
```
```
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
data "aws_caller_identity" "current" {}

data "aws_ec2_instance_type" "Agent" {
instance_type = local.AgentInstanceType
}

data "aws_ec2_instance_type" "App" {
instance_type = local.AppInstanceType
}

data "aws_region" "current" {}

data "aws_availability_zones" "available" {
Expand All @@ -21,4 +29,8 @@ data "cloudinit_config" "init_cli" {
UserName: local.AppUserName
})
}
}
}

data "http" "ip" {
url = "https://ifconfig.me/ip"
}
Original file line number Diff line number Diff line change
@@ -1,27 +1,30 @@
locals {
AgentInstanceType = var.AgentInstanceType
Agent1Eth2PrivateIpAddresses = [ "10.0.2.22", "10.0.2.23", "10.0.2.24", "10.0.2.25", "10.0.2.26", "10.0.2.27", "10.0.2.28", "10.0.2.29", "10.0.2.30", "10.0.2.31" ]
Agent1InstanceId = "agent1"
ApiMaxRetries = var.ApiMaxRetries
AppInstanceType = var.AppInstanceType
AppTag = "bps"
AppUserName = "ixia"
AwsAccessCredentialsAccessKey = var.AwsAccessCredentialsAccessKey
AwsAccessCredentialsSecretKey = var.AwsAccessCredentialsSecretKey
InboundIPv4CidrBlocks = var.InboundIPv4CidrBlocks
InboundIPv4CidrBlocks = var.InboundIPv4CidrBlocks == null ? [ "${data.http.ip.response_body}/32" ] : var.InboundIPv4CidrBlocks
File1Content = tls_private_key.SshKey.private_key_pem
File1Name = "id_rsa"
File2Content = tls_private_key.SshKey.public_key_openssh
File2Name = "authorized_keys"
File3Content = tls_private_key.SshKey.public_key_openssh
File3Name = "id_rsa.pub"
PlacementGroupName = "${local.Preamble}-placement-group-${local.Region}"
PlacementGroupStrategy = "cluster"
Preamble = "${local.UserLoginTag}-${local.UserProjectTag}-${local.AppTag}"
PrivateSubnetAvailabilityZone = var.PrivateSubnetAvailabilityZone
PublicSubnetAvailabilityZone = var.PublicSubnetAvailabilityZone
Region = data.aws_region.current.name
Region = data.aws_region.current.id
SshKeyAlgorithm = "RSA"
SshKeyName = "${local.Preamble}-ssh-key"
SshKeyRsaBits = "4096"
UserEmailTag = var.UserEmailTag == null ? data.aws_caller_identity.current.user_id : var.UserEmailTag
UserLoginTag = var.UserLoginTag == null ? "terraform" : var.UserLoginTag
UserProjectTag = var.UserProjectTag == null ? random_id.RandomId.id : var.UserProjectTag
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module "App" {
source = "git::https://github.com/armdupre/terraform-aws-module-bps-app.git?ref=11.20.0"
source = "git::https://github.com/Keysight/terraform-aws-module-bps-app.git?ref=26.0.0"
Eth0SecurityGroupId = module.Vpc.PublicSecurityGroup.id
Eth0SubnetId = module.Vpc.PublicSubnet.id
InstanceType = local.AppInstanceType
Expand All @@ -13,24 +13,32 @@ module "App" {
}

module "Agent1" {
source = "git::https://github.com/armdupre/terraform-aws-module-bps-agent.git?ref=11.20.0"
source = "git::https://github.com/Keysight/terraform-aws-module-bps-agent.git?ref=26.0.0"
Eth0SecurityGroupId = module.Vpc.PublicSecurityGroup.id
Eth0SubnetId = module.Vpc.PublicSubnet.id
Eth1SecurityGroupId = module.Vpc.PrivateSecurityGroup.id
Eth1SubnetId = module.Vpc.PrivateSubnet.id
Eth2PrivateIpAddresses = local.Agent1Eth2PrivateIpAddresses
Eth2SecurityGroupId = module.Vpc.PrivateSecurityGroup.id
Eth2SubnetId = module.Vpc.PrivateSubnet.id
InstanceId = local.Agent1InstanceId
InstanceType = local.AgentInstanceType
PlacementGroupId = aws_placement_group.PlacementGroup.id
UserEmailTag = local.UserEmailTag
UserLoginTag = local.UserLoginTag
UserProjectTag = local.UserProjectTag
init_cli = data.cloudinit_config.init_cli.rendered
depends_on = [
aws_placement_group.PlacementGroup,
module.Vpc
]
}

resource "aws_placement_group" "PlacementGroup" {
name = local.PlacementGroupName
strategy = local.PlacementGroupStrategy
}

resource "random_id" "RandomId" {
byte_length = 4
}
}
Original file line number Diff line number Diff line change
@@ -1,42 +1,99 @@
output "AgentAmi" {
output "Agent1" {
value = {
"image_id" : module.Agent1.Ami.image_id
"name" : module.Agent1.Ami.name
"owner_id" : module.Agent1.Ami.owner_id
ami = {
image_id = module.Agent1.Ami.image_id
name = module.Agent1.Ami.name
owner_id = module.Agent1.Ami.owner_id
}
availability_zone = module.Agent1.Instance.availability_zone
eth0 = {
eip = {
public_dns = module.Agent1.Eth0ElasticIp.public_dns
public_ip = module.Agent1.Eth0ElasticIp.public_ip
}
}
id = module.Agent1.Instance.id
instance_type = {
current_generation = data.aws_ec2_instance_type.Agent.current_generation
dedicated_hosts_supported = data.aws_ec2_instance_type.Agent.dedicated_hosts_supported
default_cores = data.aws_ec2_instance_type.Agent.default_cores
default_network_card_index = data.aws_ec2_instance_type.Agent.default_network_card_index
default_threads_per_core = data.aws_ec2_instance_type.Agent.default_threads_per_core
default_vcpus = data.aws_ec2_instance_type.Agent.default_vcpus
ena_srd_supported = data.aws_ec2_instance_type.Agent.ena_srd_supported
ena_support = data.aws_ec2_instance_type.Agent.ena_support
hypervisor = data.aws_ec2_instance_type.Agent.hypervisor
ipv6_supported = data.aws_ec2_instance_type.Agent.ipv6_supported
maximum_ipv4_addresses_per_interface = data.aws_ec2_instance_type.Agent.maximum_ipv4_addresses_per_interface
maximum_ipv6_addresses_per_interface = data.aws_ec2_instance_type.Agent.maximum_ipv6_addresses_per_interface
maximum_network_cards = data.aws_ec2_instance_type.Agent.maximum_network_cards
maximum_network_interfaces = data.aws_ec2_instance_type.Agent.maximum_network_interfaces
memory_size = data.aws_ec2_instance_type.Agent.memory_size
name = module.Agent1.Instance.instance_type
network_performance = data.aws_ec2_instance_type.Agent.network_performance
supported_architectures = data.aws_ec2_instance_type.Agent.supported_architectures
supported_cpu_features = data.aws_ec2_instance_type.Agent.supported_cpu_features
supported_placement_strategies = data.aws_ec2_instance_type.Agent.supported_placement_strategies
}
private_dns = module.Agent1.Instance.private_dns
private_ip = module.Agent1.Instance.private_ip
}
}

output "Agent1Eth0ElasticIp" {
output "App" {
value = {
"public_dns" : module.Agent1.Eth0ElasticIp.public_dns
"public_ip" : module.Agent1.Eth0ElasticIp.public_ip
}
}

output "AppAmi" {
value = {
"image_id" : module.App.Ami.image_id
"name" : module.App.Ami.name
"owner_id" : module.App.Ami.owner_id
}
}

output "AppEth0ElasticIp" {
value = {
"public_dns" : module.App.Eth0ElasticIp.public_dns
"public_ip" : module.App.Eth0ElasticIp.public_ip
ami = {
image_id = module.App.Ami.image_id
name = module.App.Ami.name
owner_id = module.App.Ami.owner_id
}
availability_zone = module.App.Instance.availability_zone
eth0 = {
eip = {
public_dns = module.App.Eth0ElasticIp.public_dns
public_ip = module.App.Eth0ElasticIp.public_ip
}
}
id = module.App.Instance.id
instance_type = {
current_generation = data.aws_ec2_instance_type.App.current_generation
dedicated_hosts_supported = data.aws_ec2_instance_type.App.dedicated_hosts_supported
default_cores = data.aws_ec2_instance_type.App.default_cores
default_network_card_index = data.aws_ec2_instance_type.App.default_network_card_index
default_threads_per_core = data.aws_ec2_instance_type.App.default_threads_per_core
default_vcpus = data.aws_ec2_instance_type.App.default_vcpus
ena_srd_supported = data.aws_ec2_instance_type.App.ena_srd_supported
ena_support = data.aws_ec2_instance_type.App.ena_support
hypervisor = data.aws_ec2_instance_type.App.hypervisor
ipv6_supported = data.aws_ec2_instance_type.App.ipv6_supported
maximum_ipv4_addresses_per_interface = data.aws_ec2_instance_type.App.maximum_ipv4_addresses_per_interface
maximum_ipv6_addresses_per_interface = data.aws_ec2_instance_type.App.maximum_ipv6_addresses_per_interface
maximum_network_cards = data.aws_ec2_instance_type.App.maximum_network_cards
maximum_network_interfaces = data.aws_ec2_instance_type.App.maximum_network_interfaces
memory_size = data.aws_ec2_instance_type.App.memory_size
name = module.App.Instance.instance_type
network_performance = data.aws_ec2_instance_type.App.network_performance
supported_architectures = data.aws_ec2_instance_type.App.supported_architectures
supported_cpu_features = data.aws_ec2_instance_type.App.supported_cpu_features
supported_placement_strategies = data.aws_ec2_instance_type.App.supported_placement_strategies
}
private_dns = module.App.Instance.private_dns
private_ip = module.App.Instance.private_ip
}
}

output "AvailabilityZones" {
value = {
"available.names" : data.aws_availability_zones.available.names
available = {
names = data.aws_availability_zones.available.names
}
region = data.aws_availability_zones.available.region
}
}

output "SshKey" {
sensitive = true
value = {
"private_key_pem" : tls_private_key.SshKey.private_key_pem
private_key_pem = tls_private_key.SshKey.private_key_pem
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# AgentInstanceType = "c5n.xlarge"
# AgentInstanceType = "c6in.xlarge"
# ApiMaxRetries = 1
# AppInstanceType = "c5.xlarge"
# InboundIPv4CidrBlocks = [ "0.0.0.0/0" ]
Expand All @@ -7,4 +7,4 @@
# Region = "us-east-1"
# UserEmailTag = "terraform@example.com"
# UserLoginTag = "terraform"
# UserProjectTag = "cloud-ist"
# UserProjectTag = "cloud-ist"
Loading