2021-04-09 08:42:54 +0200 +0200

Prskavčí blog

May 14, 2015

Amazon Elastic Beanstalk a docker

Amazon Elastic Beanstalk je Platform as Service podobný známému Heroku. Jen je součást Amazon Web Services. Podporuje řadu jazyků a v neposlední době přidal podporu Dockeru. Díky podpoře docker kontejnerů je možné pustit víceméně cokoliv.

Amazon web services operují v několika regionech. Dnes je jich 10 a z toho máte dva i v evropě. Pokud chcete zkoušet novinky, které AWS poskytuje doporučuji použít region us-east-1.

Amazon kromě regionů, které vám umožňují poskytovat služby z geograficky nejbližšího místa vašim zákazníkům, také podporuje Availability Zones (AZ), které vám umožňují zvýšit spolehlivost v jednom regionu. V každém regionu je k dispozici několik zón. Pokud máte skupinu serverů ve škálovacím režimu je dobré je rozprostřít přes několik AZ a tím máte jistotu pokud dojde k výpadku jedné zóny, že vaše služba poběží.

Elastic Beanstalk podporuje PHP, NodeJS, Python, Ruby, Java, Go a Docker.

Teď k Elastic Beanstalku (EB). Služba využívá zdroje AWS. Na vstupu je Elastic Load Balancer, který vám směřuje provoz na vaši aplikaci.

Docker

Pro funkci dockeru potřebujete buď Dockerrun.aws.json nebo Dockerfile. Já pro svůj příklad používám json file.

{
    "AWSEBDockerrunVersion": "1",
    "Image": {
        "Name": "registry:0.9.1"
    },
    "Volumes": [
    ],
    "Ports": [
        {
            "ContainerPort": "5000"
        }
    ]
}

tady je příslušný dockerfile, ale ten nemusíte použít. Buď json file nebo dockerfile.

FROM registry:0.9.1

ENV DEPS loose
RUN pip uninstall -y docker-registry-core && pip uninstall -y boto && pip install boto==2.34.0 && pip install docker-registry-core

RUN env

ENV SETTINGS_FLAVOR s3
ENV AWS_BUCKET $AWS_S3_BUCKET
ENV STORAGE_PATH /registry
ENV AWS_KEY $AWS_S3_ACCESS_KEY
ENV AWS_SECRET $AWS_S3_SECRET_KEY
ENV AWS_REGION $AWS_S3_REGION
ENV AWS_HOST s3.amazonaws.com
ENV AWS_PORT 443
ENV AWS_CALLING_FORMAT REGULAR
ENV DEBUG True
ENV LOGLEVEL debug

EXPOSE 5000

CMD ["docker-registry"]

Možná vás překvapí, že kontainer nemá definovaný port na který má být směřovám. EB ve verzi 1 směřuje všechno na port 80, kde nginx proxy. Pokud definujete více portů použije se jen ten poslední.

Není to moc užitečné a pokud potřebujete použít více portů nenašel jsem vhodné řešení. Konfigurční předpis, ale již existuje ve verzi 2, kde jsou možnosti mnohem širší a tyto problémy se dají dobře řešit. Ale zatím to není v oficiální dokumentaci a našel jsem to jen AWS labs.

Nginx Proxy

Jak jsem říkal v předchozím odstavci, máte defaultní nginx proxy a veškeré nastavení se dá změnit, ale musíte to udělat pomocí adresáře .ebextensions.

Například konfigurace nginxu:

files:
  "/etc/nginx/docker-registry.conf":
    mode: "000644"
    owner: root
    owner: root
    content: |
      proxy_pass                        https://docker;
      proxy_http_version                1.1;
      proxy_set_header  Host            $http_host;
      proxy_set_header  X-Real-IP       $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  Authorization  "";
      proxy_read_timeout               900;

a tady konfigurace vlastní website, kde jsem přidal autorizaci.

files:
  "/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf":
    mode: "000644"
    owner: root
    owner: root
    content: |
      server {
        listen 80;

        client_max_body_size 0;
        chunked_transfer_encoding on;

        location / {
          auth_basic            "Restricted";
          auth_basic_user_file  docker-registry.htpasswd;
          include               docker-registry.conf;
        }

        location /_ping {
          auth_basic off;
          include               docker-registry.conf;
        }

        location /v1/_ping {
          auth_basic off;
          include               docker-registry.conf;
        }
      }

Závěr

Je potřeba definovat několik proměnných prostředí, které jsou vidět na skriptu pro spuštění.

docker run \
         -e SETTINGS_FLAVOR=s3 \
         -e AWS_BUCKET=$AWS_S3_BUCKET \
         -e STORAGE_PATH=/registry \
         -e AWS_KEY=$AWS_S3_ACCESS_KEY \
         -e AWS_SECRET=$AWS_S3_SECRET_KEY \
         -e SEARCH_BACKEND=sqlalchemy \
         -e DEBUG=True \
         -e LOGLEVEL=debug \
         -e AWS_REGION="us-east-1" \
         -p 5000:5000 \
         registry

PaaS jako Elastic Beanstalk je celkem použitelný, má CLI clienta, funguje s gitem. Má to některé věci, které mi chybí například na Heroku (VPC, auto scaling). Ale přesto mi například práce s heroku přijde příjemnější i když to teď zabili změnou plánů.