javascriptvue.jsaws-amplifygitpod

AWS Amplify JavaScript Gitpod automatic setup


I'm trying to set up an AWS Amplify JavaScript project with Gitpod in a way that when I start a new Workspace I don't have to manually go through the amplify-cli steps (adding IAM user, generating aws-exports.js file, etc.).

I've managed to successfully install the aws-cli and amplify-cli on the machine so far (I'm adding this to my .gitpod.yml file on task init)

$ npm install @aws-amplify/cli
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

so I can add the

$ export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
$ export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ export AWS_DEFAULT_REGION=us-west-2

environment variables to gitpod variables, but when running for example amplify pull I don't see the [default] user as I normally would when running it with local setup.


Solution

  • I've got it working, first I've added these environment variables for the amplify setup using the Gitpod account settings:

    AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
    AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    AWS_DEFAULT_REGION=us-west-2
    AWS_AMPLIFY_PROJECT_NAME=headlessProjectName
    AWS_AMPLIFY_APP_ID=amplifyServiceProjectAppId
    

    The first three are the IAM user credentials and config, the latter two are amplify specific and can be found inside the AWS console on the Amplify project.

    After that, I've created a Dockerfile for the Gitpod Custom Docker Image (as suggested by @Pauline) and a bash script that creates ~/.aws config files and runs amplify pull in a headless mode.

    .gitpod.dockerfile

    FROM gitpod/workspace-full
    
    # install aws-cli v2
    RUN sudo curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
      && unzip awscliv2.zip \
      && sudo ./aws/install
    
    # install amplify-cli
    RUN sudo curl -sL https://aws-amplify.github.io/amplify-cli/install | bash && $SHELL
    

    This will preinstall aws-cli and amplify-cli on the docker image so they are ready to use inside the workspace. Also don't forget to add the docker configuration to the top of .gitpod.yml file:

    .gitpod.yml

    image:
      file: .gitpod.Dockerfile
    

    At this point, I'm setting up Amplify in a way that I don't have to manually pick the amplify-cli options when a new workspace is started. The magic happens inside a custom bash script with the help of the environment variables specified at the start:

    amplify-pull.bash

    #!/bin/bash
    set -e
    IFS='|'
    
    # Specify the headless amplify pull parameters
    # https://docs.amplify.aws/cli/usage/headless/#amplify-pull-parameters
    VUECONFIG="{\
    \"SourceDir\":\"src\",\
    \"DistributionDir\":\"dist\",\
    \"BuildCommand\":\"npm run-script build\",\
    \"StartCommand\":\"npm run-script serve\"\
    }"
    AWSCLOUDFORMATIONCONFIG="{\
    \"configLevel\":\"project\",\
    \"useProfile\":false,\
    \"profileName\":\"default\",\
    \"accessKeyId\":\"$AWS_ACCESS_KEY_ID\",\
    \"secretAccessKey\":\"$AWS_SECRET_ACCESS_KEY\",\
    \"region\":\"$AWS_DEFAULT_REGION\"\
    }"
    AMPLIFY="{\
    \"projectName\":\"$AWS_AMPLIFY_PROJECT_NAME\",\
    \"appId\":\"$AWS_AMPLIFY_APP_ID\",\
    \"envName\":\"dev\",\
    \"defaultEditor\":\"code\"\
    }"
    FRONTEND="{\
    \"frontend\":\"javascript\",\
    \"framework\":\"vue\",\
    \"config\":$VUECONFIG\
    }"
    PROVIDERS="{\
    \"awscloudformation\":$AWSCLOUDFORMATIONCONFIG\
    }"
    
    # Create AWS credential file inside ~/.aws
    mkdir -p ~/.aws \
    && echo -e "[default]\naws_access_key_id=$AWS_ACCESS_KEY_ID\naws_secret_access_key=$AWS_SECRET_ACCESS_KEY" \
    >> ~/.aws/credentials
    
    # Create AWS config file ~/.aws
    echo -e "[default]\nregion=$AWS_DEFAULT_REGION" >> ~/.aws/config
    
    # Run amplify pull in Headless mode, 
    # this also generates thw aws-exports.js file inside /src
    amplify pull \
    --amplify $AMPLIFY \
    --frontend $FRONTEND \
    --providers $PROVIDERS \
    --yes
    
    

    I'm using Vue for my frontend as an example, so those values need to be changed depending on the project type. The rest of the params are pretty straightforward, more info about the headless mode can be found here. I'm also creating the aws config files before the amplify pull command as mentioned before.

    And this is what the final .gitpod.yml file looks like

    .gitpod.yml

    image:
      file: .gitpod.dockerfile
      
    tasks:
      - name: Amplify pull dev
        command: |
          bash amplify-pull.bash
          gp sync-done amplify
      
      - name: Install npm packages, run dev
        init: yarn install
        command: |
          gp sync-await amplify
          yarn serve
        
    ports:
      - port: 8080
        onOpen: open-preview
    

    I'm also waiting for the Amplify pull to finish before running the dev server using gp sync.