[PYTHON] Hamari officiel AWS "Création d'applications Web modernes"

AWS publie de nombreux contenus pratiques qui utilisent les services AWS. Il est également traduit en japonais.

Tutoriel pratique sur Amazon Web Services (AWS) https://aws.amazon.com/jp/getting-started/hands-on/

Lorsque je cherchais un conteneur à usage interne et du matériel didactique pratique pour les débutants d'API Gateway, J'ai trouvé le bon tutoriel.

Création d'une application Web moderne https://aws.amazon.com/jp/getting-started/hands-on/build-modern-app-fargate-lambda-dynamodb-python/

Ce tutoriel,

Vous pouvez découvrir étape par étape la construction d'une plate-forme d'exécution d'applications moderne, telle que Très bon contenu.

image.png Source: https://aws.amazon.com/jp/getting-started/hands-on/build-modern-app-fargate-lambda-dynamodb-python/

Bon contenu ... très bon contenu ...

Même si je l'ai essayé selon la procédure du tutoriel, il y avait certains points qui n'ont pas fonctionné, donc Je voudrais faire une note. Des ressources pour .NET, Go et Java sont également disponibles, mais cet article est un rappel de mon essai avec Python.

Module 2B: Déploiement de services à l'aide d'AWS Fargate

Étape 1: créer un service Flask

R: Construisez l'image Docker

Je fais docker construit sur Cloud9 IDE ...

docker build . -t REPLACE_ME_AWS_ACCOUNT_ID.dkr.ecr.REPLACE_ME_REGION.amazonaws.com/mythicalmysfits/service:latest

L'installation de python-Pip et pip va mousser.

Building dependency tree...
Reading state information...
E: Unable to locate package python-pip
The command '/bin/sh -c apt-get install -y python-pip python-dev build-essential' returned a non-zero code: 100
Step 5/13 : RUN pip install --upgrade pip
 ---> Running in 944121289de0
/bin/sh: 1: pip: not found
The command '/bin/sh -c pip install --upgrade pip' returned a non-zero code: 127

Depuis août 2020, ubuntu: le dernier Python est la série v3, donc Rendons Dockerfile compatible avec python3.

python-pip est maintenant ** python3-pip **, pip à ** pip3 **, Changez le python de ENTRYPOINT en ** python3 **.

FROM ubuntu:latest
RUN echo Updating existing packages, installing and upgrading python and pip.
RUN apt-get update -y
RUN apt-get install -y python3-pip python-dev build-essential
RUN pip3 install --upgrade pip
RUN echo Copying the Mythical Mysfits Flask service into a service directory.
COPY ./service /MythicalMysfitsService
WORKDIR /MythicalMysfitsService
RUN echo Installing Python packages listed in requirements.txt
RUN pip3 install -r ./requirements.txt
RUN echo Starting python and starting the Flask service...
ENTRYPOINT ["python3"]
CMD ["mythicalMysfitsService.py"]

Modifions le Dockerfile fourni dans le module-3 et plus tard de la même manière.

C: Poussez l'image Docker vers Amazon ECR

Vous devez vous connecter avant de pousser docker vers ECR ...

$(aws ecr get-login --no-include-email)

get-login est obsolète, utilisez donc ** get-login-password **.

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com

Module 2C: Automatisation du déploiement à l'aide des services de code AWS

Étape 1: créer un pipeline CI / CD

C: créer un projet CodeBuild

L'exécution de l'AWS CLI fournie créera un projet CodeBuild, Si vous déplacez le pipeline CI / CD à l'étape 2, la construction sera moss.

La cause est que le get-login obsolète ci-dessus est utilisé dans buildspec.yml. À la place, utilisez ** aws ecr get-login-password **.

Ouvrez le fichier: //~/environment/aws-modern-application-workshop/module-2/aws-cli/ecr-policy.json et ouvrez phase de pré-construction

- $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)

À

- aws ecr get-login-password --region $AWS_DEFAULT_REGION) | docker login --username AWS --password-stdin  $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com

Fixons-le.

Module 3: Enregistrer les informations Mysfit

Étape 2: Validez le premier changement de code réel

R: Copiez le code de service Flask mis à jour

Les ressources à pousser vers CodeCommit sont préparées à l'avance, Copiez-le dans le répertoire du référentiel.

cp -r ~/environment/aws-modern-application-workshop/module-2/app/* ~/environment/MythicalMysfitsService-Repository/

Pousser cette ressource vers CodeCommit déploiera l'application sur ECS, La tâche tombera.

2020-08-30 16:22:28Traceback (most recent call last):
2020-08-30 16:22:28File "mythicalMysfitsService.py", line 3, in <module>
2020-08-30 16:22:28import mysfitsTableClient
2020-08-30 16:22:28File "/MythicalMysfitsService/mysfitsTableClient.py", line 104
2020-08-30 16:22:28print 'filter is '+args.filter
2020-08-30 16:22:28^
2020-08-30 16:22:28SyntaxError: Missing parentheses in call to 'print'. Did you mean print('filter is '+args.filter)?

En regardant le journal des tâches ECS, il manque la fonction d'impression dans mysfitsTableClient.py.

Ce tutoriel semble avoir été développé avec Python 2.7. Comme la description de la fonction d'impression est différente dans Python 3 spécifiée dans le Dockerfile, Modifiez l'appli.

Avant correction

    if args.filter and args.value:
        print 'filter is '+args.filter
        print 'value is '+args.value

        print "Getting filtered values"
        items = queryMysfitItems(args.filter, args.value)
    else:
        print "Getting all values"
        items = getAllMysfits()

    print items

modifié

    if args.filter and args.value:
        print('filter is '+args.filter)
        print('value is '+args.value)

        print("Getting filtered values")
        items = queryMysfitItems(args.filter, args.value)
    else:
        print("Getting all values")
        items = getAllMysfits()

    print(items)

Module 4: Paramètres d'enregistrement des utilisateurs

Étape 2: Ajouter une nouvelle API REST et Amazon API Gateway

B: Créez une API REST à l'aide de Swagger

J'essaye de créer une API REST en important une définition d'API à partir d'une définition Swagger ...

aws apigateway import-rest-api --parameters endpointConfigurationTypes=REGIONAL --body file://~/environment/aws-modern-application-workshop/module-4/aws-cli/api-swagger.json --fail-on-warnings

Je n'obtiens pas de réponse JSON comme celle de la procédure du didacticiel. La valeur de retour du shell est 255 et aucune passerelle API n'est créée.

Premièrement, je doutais de la définition de Swagger. Vous pouvez utiliser https://editor.swagger.io/ ou le plug-in Open API Editor de VSCode, Si vous vérifiez la définition de api-swagger.json, POST / mysfits / {mysfitId} / comme définition, partie x-amazon-apigateway-integration Vous pouvez voir que les réponses sont dupliquées. image.png

Après tout, je vais effacer les réponses en double, mais Le résultat de aws apigateway import-rest-api ne change pas ... pourquoi?

Dans ce cas, exécutez-le avec l'option --debug.

aws apigateway import-rest-api --parameters endpointConfigurationTypes=REGIONAL --body file://~/environment/aws-modern-application-workshop/module-4/aws-cli/api-swagger.json --fail-on-warnings --debug

Alors ~? ?? ??

2020-08-31 06:39:10,907 - MainThread - awscli.clidriver - DEBUG - CLI version: aws-cli/2.0.11 Python/3.7.3 Linux/4.14.181-142.260.amzn2.x86_64 botocore/2.0.0dev15
(Omission)
2020-08-31 06:39:10,994 - MainThread - awscli.clidriver - DEBUG - Exception caught in main()
Traceback (most recent call last):
  File "awscli/customizations/binaryformat.py", line 59, in _visit_scalar
  File "base64.py", line 87, in b64decode
binascii.Error: Invalid base64-encoded string: number of data characters (6953) cannot be 1 more than a multiple of 4
(Omission)
  File "awscli/customizations/binaryformat.py", line 34, in base64_decode_input_blobs
  File "awscli/shorthand.py", line 389, in visit
  File "awscli/shorthand.py", line 394, in _visit
  File "awscli/shorthand.py", line 401, in _visit_structure
  File "awscli/shorthand.py", line 394, in _visit
  File "awscli/customizations/binaryformat.py", line 61, in _visit_scalar
awscli.customizations.binaryformat.InvalidBase64Error: Invalid base64: "{
    "swagger": 2.0,
    "info": {
        "title": "MysfitsApi"

Invalid base64?

Voyons les changements d'AWS CLI v1 à v2.

Modifications importantes - Migration de la version 1 de l'AWS CLI vers la version 2 - Interface de ligne de commande AWS https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration.html#cliv2-migration-binaryparam

Oh! !! !!

AWS CLI version 2 transmet désormais tous les paramètres d'entrée et de sortie binaires sous forme de chaîne codée en base64 par défaut. (Omis) Vous pouvez également remplacer les paramètres de profil actifs et annuler les paramètres de commandes individuelles en incluant le paramètre --cli-binary-format raw-in-base64-out sur la ligne de commande.

Je vois. Le fichier de définition Swagger n'est pas spécifiquement encodé en base64, donc ** --cli-binary-format raw-in-base64-out ** Ajoutons un paramètre.

aws apigateway import-rest-api --cli-binary-format raw-in-base64-out --parameters endpointConfigurationTypes=REGIONAL --body file://~/environment/aws-modern-application-workshop/module-4/aws-cli/api-swagger.json --fail-on-warnings --debug

J'ai réussi.

{
    "id": "6xxxxxxxx3",
    "name": "MysfitsApi",
    "createdDate": "2020-08-31T07:29:58+00:00",
    "version": "2017-04-20T04:08:08Z",
    "apiKeySource": "HEADER",
    "endpointConfiguration": {
        "types": [
            "REGIONAL"
        ]
    }
}

J'ai pu terminer le reste des étapes sans problème particulier.

Je vais donner un problème à Github pour les parties qui doivent être mises à jour telles que l'AWS CLI et Dockerfile, Il faudra un certain temps pour être reflété sur le site Web du didacticiel (en particulier la version japonaise), donc Veuillez vous y référer comme document auxiliaire.

Vous pouvez découvrir étape par étape la création d'applications natives dans le cloud. Ceux qui veulent apprendre ECS, API Gateway, Cognito, Kinesis Firehose, etc. tout en bougeant leurs mains, Essayez-le! !! !!

Recommended Posts

Hamari officiel AWS "Création d'applications Web modernes"
En savoir plus sur les applications Web sans serveur AWS