1
votes

I want to start a task from at Container Instance launch time.So I have followed the this Starting task at instance launch Document which provided the MIME multi-part user data script. I have created a cloud formation template to launch an instance with the MIME multi-part user data script.

EC2 Resource has been created with the Cloud formation template, but I am not able to SSH into that instance and I am not able to System logs from EC2 management console as well.

CloudFormation Template

{
    "AWSTemplateFormatVersion" : "2010-09-09",

    "Description" :" ECS instance",

    "Parameters" : {

    },

    "Resources" :{
        "EC2Instance":{
             "Type" : "AWS::EC2::Instance",
              "Properties" : {
                "SecurityGroupIds":["sg-16021f35"]
                 "ImageId" : "ami-ec33cc96",
                 "UserData":{
                    "Fn::Base64":{
                        "Fn::Join":[
                        "\n",
                            [
                            {
                                "Fn::Join":[
                                "",
                                    [
                                        "Content-Type: multipart/mixed; boundary=",
                                        "==BOUNDARY=="
                                    ]
                                ]
                            },
                            "MIME-Version: 1.0",
                            "--==BOUNDARY==",
                            {
                                "Fn::Join":[
                                "",
                                    [
                                        "Content-Type: text/upstart-job; charset=",
                                        "us-ascii"
                                    ]
                                ]
                            },
                            "#!/bin/bash",
                            "# Specify the cluster that the container instance should register into",
                            "echo ECS_CLUSTER=Demo >> /etc/ecs/ecs.config",
                            "# Install the AWS CLI and the jq JSON parser",
                            "yum install -y aws-cli jq",
                            "#upstart-job",
                            {
                                "Fn::Join":[
                                " ",[
                                        "description",
                                        "Amazon EC2 Container Service (start task on instance boot)"
                                    ]
                                ]
                            },
                            {
                                "Fn::Join":[
                                " ",[
                                        "author",
                                        "Amazon Web Services"
                                    ]
                                ]
                            },
                            "start on started ecs",
                            "script",
                            "exec 2>>/var/log/ecs/ecs-start-task.log",
                            "set -x",
                            "until curl -s http://localhost:51678/v1/metadata",
                            "do",
                            "sleep 1",
                            "done",
                            "# Grab the container instance ARN and AWS region from instance metadata",
                            "instance_arn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' )",
                            "cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster' | awk -F/ '{print $NF}' )",
                            "region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}')",
                            "# Specify the task definition to run at launch",
                            "task_definition=ASG-Task",
                            "# Run the AWS CLI start-task command to start your task on this container instance",
                            "aws ecs start-task --cluster $cluster --task-definition $task_definition --container-instances $instance_arn --started-by $instance_arn",
                            "end script",
                            "--==BOUNDARY==--"
                            ]
                        ]
                    }
                 },
                 "IamInstanceProfile":"ecsInstanceRole",
                 "InstanceType":"t2.micro",
                 "SubnetId":"subnet-841103e1"

              }
        }
        },
    "Outputs" : {
    }
}

MIME multi-part User-Data:

Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version: 1.0

--==BOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
# Specify the cluster that the container instance should register into
cluster=your_cluster_name

# Write the cluster configuration variable to the ecs.config file
# (add any other configuration variables here also)
echo ECS_CLUSTER=$cluster >> /etc/ecs/ecs.config

# Install the AWS CLI and the jq JSON parser
yum install -y aws-cli jq

--==BOUNDARY==
Content-Type: text/upstart-job; charset="us-ascii"

#upstart-job
description "Amazon EC2 Container Service (start task on instance boot)"
author "Amazon Web Services"
start on started ecs

script
    exec 2>>/var/log/ecs/ecs-start-task.log
    set -x
    until curl -s http://localhost:51678/v1/metadata
    do
        sleep 1
    done

    # Grab the container instance ARN and AWS region from instance metadata
    instance_arn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' )
    cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster' | awk -F/ '{print $NF}' )
    region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}')

    # Specify the task definition to run at launch
    task_definition=my_task_def

    # Run the AWS CLI start-task command to start your task on this container instance
    aws ecs start-task --cluster $cluster --task-definition $task_definition --container-instances $instance_arn --started-by $instance_arn --region $region
end script
--==BOUNDARY==--
1
I don't see any security groups in your CloudFormation template. You can't SSH to an EC2 instance unless you open port 22. See docs.aws.amazon.com/AWSEC2/latest/UserGuide/… and docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/….jarmod
Updated the template. I have added the security group which opens port 22 to the public(0.0.0.0/0)when launching the stack. Interestingly when I launched the instance through the wizard(Management console) it is worked fine. I guess I am missing something in user-data in cloud formation templateNaveen Kerati
Strip the user data from the template and see if you can get basic SSH to EC2 working. It's probably not the user data that's the issue. Fix that before reintroducing the userdata.jarmod

1 Answers

0
votes

you need to specify the key file and security group in your formation template as suggested by jarmod above.