skip to Main Content

I am using Github action "Deploy to Amazon ECS" to create Docker container from Node.js backend and deploy it on ECS.

During deployment, I receive following error:

Fill in the new image ID in the Amazon ECS task definition

Run aws-actions/amazon-ecs-render-task-definition@v1
Error: /home/runner/work/project-app-strapi/project-app-strapi/task-definition.json: Unexpected token � in JSON at position 0

The task-definition.json was generated by following command (as I am not very experienced with aws ecs CLI and prefer to create the infrastructure using AWS Console):

aws ecs describe-task-definition --task-definition "arn:aws:ecs:eu-west-1:076457945931:task-definition/project-strapi:2" --profile project > task-definition.json

also checked the file and it is valid json that doesn’t contain any harmful hidden characters. It looks like this:

{
    "taskDefinition": {
        "taskDefinitionArn": "arn:aws:ecs:eu-west-1:076457945931:task-definition/project-strapi:2",
        "containerDefinitions": [{
            "name": "project-app",
            "image": "076457945931.dkr.ecr.eu-west-1.amazonaws.com/company/project-strapi",
            "cpu": 0,
            "portMappings": [{
                "containerPort": 1337,
                "hostPort": 1337,
                "protocol": "tcp"
            }],
            "essential": true,
            ... other fields, I don't believe they are needed
}

Workflow file is same as the default aws.yml for this Github Action, no changes were made here (besides filling variables):

name: Deploy to Amazon ECS

on:
  push:
    branches: [ "main" ]

env:
  AWS_REGION: eu-west-1                   # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: company/project-strapi           # set this to your Amazon ECR repository name
  ECS_SERVICE: project-strapi                 # set this to your Amazon ECS service name
  ECS_CLUSTER: project-strapi-app                 # set this to your Amazon ECS cluster name
  ECS_TASK_DEFINITION: task-definition.json # set this to the path to your Amazon ECS task definition
                                               # file, e.g. .aws/task-definition.json
  CONTAINER_NAME: project-app           # set this to the name of the container in the
                                               # containerDefinitions section of your task definition

permissions:
  contents: read

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}

    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1
    
    - name: Build, tag, and push image to Amazon ECR
      id: build-image
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        IMAGE_TAG: ${{ github.sha }}
      run: |
        # Build a docker container and
        # push it to ECR so that it can
        # be deployed to ECS.
        docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
        echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
    
    - name: Fill in the new image ID in the Amazon ECS task definition
      id: task-def
      uses: aws-actions/amazon-ecs-render-task-definition@v1
      with:
        task-definition: ${{ env.ECS_TASK_DEFINITION }}
        container-name: ${{ env.CONTAINER_NAME }}
        image: ${{ steps.build-image.outputs.image }}

    - name: Deploy Amazon ECS task definition
      uses: aws-actions/amazon-ecs-deploy-task-definition@v1
      with:
        task-definition: ${{ steps.task-def.outputs.task-definition }}
        service: ${{ env.ECS_SERVICE }}
        cluster: ${{ env.ECS_CLUSTER }}
        wait-for-service-stability: true

I tried several things, specifically various changes to formatting of json, changing the directory of the file, but the error remains.

2

Answers


  1. First Download the task-defination file then update the image of the task-defination then update it to the ecs service, then you wont get any issue

          - name: Download task definition
            run: |
              aws ecs describe-task-definition --task-definition **your task defination name** --query taskDefinition > taskdefinition.json
    
          - name: new image in ECS taskdefinition
            id: demo
            uses: aws-actions/amazon-ecs-render-task-definition@v1
            with:
              task-definition: taskdefinition.json
              container-name: **your container name**
              image: ${{ steps.check_files.outputs.**image** }}
              
          - name: updating task-definition file
            run: cat ${{ steps.demo.outputs.task-definition }} > taskdefinition.json
    
    
    Login or Signup to reply.
  2. I had to execute the command to generate the task-definition file without the ‘> task-definition’, cause this "auto-generation" was breaking the json file.

    Had to execute the command:

     aws ecs describe-task-definition --task-definition **your task defination name** --query taskDefinition
    

    grab every line of output, and create manually the json file. So then worked.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search