Adding service discovery to EC2 backends

The following SSM Document lets you register / deregister EC2 instances belonging to an Auto Scaling Group in Cloud Map service using servicectl.

  • Execute the following script to create the SSM document

    cat <<-"EOF" > /tmp/configure_cloudmap.yml
    ---
    schemaVersion: '2.2'
    description: Configure Cloud Map
    parameters: 
      serviceId:
        type: String
    instancePort:
        type: String
    mainSteps:
    - action: aws:runShellScript
      name: configureCloudMap
      inputs:
        runCommand: 
          - |
            #! /bin/bash
          
            EC2_METADATA=http://169.254.169.254/latest
            REGION=$(curl -s $EC2_METADATA/dynamic/instance-identity/document | jq -r '.region')
            INSTANCE_ID=$(curl -s $EC2_METADATA/meta-data/instance-id);
            INSTANCE_IP=$(curl -s $EC2_METADATA/latest/meta-data/local-ipv4);
    
            cat > /etc/init.d/cloudmap-register <<-EOF
            #! /bin/bash -ex
            aws servicediscovery register-instance \
              --region $REGION \
              --service-id {{serviceId}} \
              --instance-id $INSTANCE_ID \
              --attributes AWS_INSTANCE_IPV4=$INSTANCE_IP,AWS_INSTANCE_PORT={{instancePort}}
            exit 0
            EOF
            chmod a+x /etc/init.d/cloudmap-register
    
            cat > /etc/init.d/cloudmap-deregister <<-EOF
            #! /bin/bash -ex
            aws servicediscovery deregister-instance \
              --region $REGION \
              --service-id {{serviceid}} \
              --instance-id $INSTANCE_ID
            exit 0
            EOF
            chmod a+x /etc/init.d/cloudmap-deregister
    
            cat > /usr/lib/systemd/system/cloudmap.service <<-EOF
            [Unit]
            Description=Run CloudMap service
            Requires=network-online.target network.target
            DefaultDependencies=no
            Before=shutdown.target reboot.target halt.target
    
            [Service]
            Type=oneshot
            KillMode=none
            RemainAfterExit=yes
            ExecStart=/etc/init.d/cloudmap-register
            ExecStop=/etc/init.d/cloudmap-deregister
    
            [Install]
            WantedBy=multi-user.target
            EOF
    
            systemctl enable cloudmap.service
            systemctl start  cloudmap.service
    EOF
    aws ssm create-document \
      --name appmesh-workshop-ConfigureCloudMap \
      --document-format YAML \
      --content file://configure-cloudmap.yml \
      --document-type Command