Home > Back-end >  Github Actions - Deploy to Amazon ECS: 'task-definition.json: Unexpected token � in JSON at pos
Github Actions - Deploy to Amazon ECS: 'task-definition.json: Unexpected token � in JSON at pos

Time:10-18

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.

CodePudding user response:

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

  • Related