Create the virtual service

  • Like you did previously, start by creating a virtual node.
# Define variables #
EXT_LOAD_BALANCER=$(jq < cfn-output.json -r '.ExternalLoadBalancerDNS');
SPEC=$(cat <<-EOF
  { 
    "serviceDiscovery": {
      "dns": { 
        "hostname": "$EXT_LOAD_BALANCER"
      }
    },
    "backends": [
      {
        "virtualService": {
          "virtualServiceName": "crystal.appmeshworkshop.hosted.local"
        }
      },
      {
        "virtualService": {
          "virtualServiceName": "nodejs.appmeshworkshop.hosted.local"
        }
      }
    ],      
    "logging": {
      "accessLog": {
        "file": {
          "path": "/dev/stdout"
        }
      }
    },      
    "listeners": [
      {
        "healthCheck": {
          "healthyThreshold": 3,
          "intervalMillis": 10000,
          "path": "/health",
          "port": 3000,
          "protocol": "http",
          "timeoutMillis": 5000,
          "unhealthyThreshold": 3
        },
        "portMapping": { "port": 3000, "protocol": "http" }
      }
    ]
  }
EOF
); \
# Create app mesh virtual node #
aws appmesh create-virtual-node \
  --mesh-name appmesh-workshop \
  --virtual-node-name frontend \
  --spec "$SPEC"
  • Create the virtual service.
# Define variables #
SPEC=$(cat <<-EOF
  { 
    "provider": {
      "virtualNode": { 
        "virtualNodeName": "frontend"
      }
    }
  }
EOF
); \
# Create app mesh virtual service #
aws appmesh create-virtual-service \
  --mesh-name appmesh-workshop \
  --virtual-service-name frontend.appmeshworkshop.hosted.local \
  --spec "$SPEC"