Elixir Deployment - JSToElm
All Episodes

Elixir Deployment

When we last checked in our our struggling hero, me, I was struggling with the Jungle that is AWS and it's layers and layers of AIM roles, services accounts, interwoven services, and endless dependencies. Step one. Oh snap. After a long hard slog, and what felt like death by a thousand tiny cuts, it's working. I now have a deployed Elixir Phoenix App, building, running, rolling updating, all by git commits.

Cuts

  • ipv6:

    • this was in the
  • When to set config

  • AWS is a jungle

  • So.. I guess I need docker 🙄

  • GCP cloud_sql connection

  • Creating docker image

  • Can I test this image?

  • Debug in prod?

  • SQL Admin API access

  • Where’d PORT go?

  • Docker build is gonna need more RAM

    • docker build -t gcr.io/post-it-243617/postit:v0.4.0 . Sending build context to Docker daemon 523.8kB Error response from daemon: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
  • Docker Args

    • pass the arg
    • declare the arg
    • use the arg $DB_NAME NO CURLY BRACES
    • ok working
  • GCP Secrets?

  • Google KMS (Cloud Key Management)

    • enable KMS. we learned that from the last API, cloud sql
    • using the gcloud kms key XXXXX manual add keys one by one
    • update txt file, get back encrypted file
    • convert encrypted file to base64 and add as a variable to the cloudbuild.yaml
    args: [ 
            '-c',
            'docker build -t gcr.io/post-it-243617/postit:$REVISION_ID --build-arg DB_PASSWORD=$$db_password --build-arg  DB_NAME=$$db_name --build-arg DB_SOCKET_DIR=$$db_socket_dir --build-arg DB_USERNAME=$$db_username --build-arg SECRET_KEY_BASE=$$secret_key_base  .'  
          ]
    secretEnv: ['db_password', 'db_name', 'db_socket_dir', 'db_username', 'secret_key_base'] 
    
    "Unusable Erlang runtime system! This is likely due to being compiled for another system than the host is running"
    
    • Building with alpine-elixir:1.7.1 and then serve with alpine:latest
    • there is then a mismatch of erlang versions.
    • checked the distillery examples and locked in the alpine-elixir:1.8.2 and alpine:3.9 Both having the erlang version ERLANG_VERSION=22.0.4
  • Loadbalance and HTTPS

    • kubectl expose deployment DEPLOYMENT --type=LoadBalancer

    The key thing here is to specify the type and your deployment’s name. This will expose your deployment through a service and set up a Load Balancer on Google Cloud Platform.

    • OH??? Ingress is a kubernetes thing. I could figure out what “Ingress” was 🙄

Websockets for AppEngine

Resources

Distillery

Best Practices for deploying Elixir

PHX on kube gcp

win 10 docker more member

Docker ENV passed with -build-arg

how to KMS

Distillery with Docker

Using KMS with cloudbuild

kubectl cheetsheet

gcloud kube https

Follow

Published 28 Jun 2019

A show about learning Elm, Functional Programing, and generally leveling up as a JS developer.
JavaScript To Elm on Twitter