[PYTHON] AWS Official "Erstellen moderner Webanwendungen" Praktische Hamari

AWS veröffentlicht viele praktische Inhalte, die AWS-Services verwenden. Es wird auch ins Japanische übersetzt.

Praktisches Tutorial zu Amazon Web Services (AWS) https://aws.amazon.com/jp/getting-started/hands-on/

Als ich nach einem Container für den internen Gebrauch und praktischen Unterrichtsmaterialien für API Gateway-Anfänger suchte, Ich habe genau das richtige Tutorial gefunden.

Erstellen einer modernen Webanwendung https://aws.amazon.com/jp/getting-started/hands-on/build-modern-app-fargate-lambda-dynamodb-python/

Dieses Tutorial,

Sie können Schritt für Schritt den Aufbau einer modernen Plattform für die Anwendungsausführung erleben, z Sehr guter Inhalt.

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

Guter Inhalt ... sehr guter Inhalt ...

Auch wenn ich es gemäß dem Verfahren im Tutorial versucht habe, gab es einige Punkte, die nicht funktionierten Ich möchte eine Notiz machen. Ressourcen für .NET, Go und Java sind ebenfalls verfügbar, aber dieser Artikel erinnert mich an meine Testversion mit Python.

Modul 2B: Bereitstellen von Diensten mit AWS Fargate

Schritt 1: Erstellen Sie einen Flask-Service

A: Erstellen Sie das Docker-Image

Ich mache Docker auf Cloud9 IDE bauen ...

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

Python-Pip und Pip-Installation werden Moos.

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

Ab August 2020 ist Ubuntu: das neueste Python die v3-Serie Lassen Sie uns Dockerfile mit Python3 kompatibel machen.

Python-Pip ist jetzt ** Python3-Pip **, pip to ** pip3 **, Ändern Sie die Python von ENTRYPOINT in ** 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"]

Lassen Sie uns die in Modul 3 und höher bereitgestellte Docker-Datei auf dieselbe Weise ändern.

C: Schieben Sie das Docker-Image auf Amazon ECR

Sie müssen sich anmelden, bevor der Docker auf ECR drückt ...

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

get-login ist veraltet, verwenden Sie also ** 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

Modul 2C: Automatisierung der Bereitstellung mithilfe von AWS-Codediensten

Schritt 1: Erstellen Sie eine CI / CD-Pipeline

C: Erstellen Sie ein CodeBuild-Projekt

Durch Ausführen der bereitgestellten AWS-CLI wird ein CodeBuild-Projekt erstellt. Wenn Sie die CI / CD-Pipeline in Schritt 2 verschieben, wird der Build moos.

Die Ursache ist, dass das oben veraltete get-login in buildspec.yml verwendet wird. Verwenden Sie stattdessen ** aws ecr get-login-password **.

Öffnen Sie die Datei: //~/environment/aws-modern-application-workshop/module-2/aws-cli/ecr-policy.json und öffnen Sie sie Pre_build-Phase

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

Zu

- 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

Lassen Sie es uns beheben.

Modul 3: Mysfit-Informationen speichern

Schritt 2: Übernehmen Sie die erste tatsächliche Codeänderung

A: Kopieren Sie den aktualisierten Flask-Servicecode

Ressourcen, die an CodeCommit gesendet werden sollen, werden im Voraus vorbereitet. Kopieren Sie es in das Verzeichnis für das Repository.

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

Wenn Sie diese Ressource an CodeCommit senden, wird die App für ECS bereitgestellt. Die Aufgabe wird gelöscht.

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)?

Das ECS-Aufgabenprotokoll fehlt in der Druckfunktion in mysfitsTableClient.py.

Dieses Tutorial scheint mit Python 2.7 entwickelt worden zu sein. Da die Beschreibung der Druckfunktion in Python 3, das in der Docker-Datei angegeben ist, unterschiedlich ist, Ändern Sie die App.

Vor der Korrektur

    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

Überarbeitet

    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)

Modul 4: Benutzerregistrierungseinstellungen

Schritt 2: Fügen Sie eine neue REST-API und ein neues Amazon API-Gateway hinzu

B: Erstellen Sie eine REST-API mit Swagger

Ich versuche, eine REST-API zu erstellen, indem ich eine API-Definition aus einer Swagger-Definition importiere ...

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

Ich erhalte keine JSON-Antwort wie im Tutorial. Der Rückgabewert der Shell ist 255 und es wird kein API-Gateway erstellt.

Zuerst bezweifelte ich die Swagger-Definition. Sie können https://editor.swagger.io/ oder das Open API Editor-Plug-In von VSCode verwenden. Wenn Sie die Definition von api-swagger.json überprüfen, POST / mysfits / {mysfitId} / ähnliche Definition, x-amazon-apigateway-Integrationsteil Sie können sehen, dass die Antworten doppelt vorhanden sind. image.png

Immerhin werde ich die doppelten Antworten löschen, aber Das Ergebnis von aws apigateway import-rest-api ändert sich nicht ... warum?

Führen Sie es in diesem Fall mit der Option --debug aus.

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

Dann ~? ?? ??

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
(Unterlassung)
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
(Unterlassung)
  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?

Sehen wir uns die Änderungen von AWS CLI v1 zu v2 an.

Wichtige Änderungen - Migration von AWS CLI Version 1 auf Version 2 - AWS-Befehlszeilenschnittstelle https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration.html#cliv2-migration-binaryparam

Oh! !! !!

AWS CLI Version 2 übergibt jetzt standardmäßig alle binären Eingabe- und Ausgabeparameter als base64-codierte Zeichenfolge. (Weggelassen) Sie können auch die aktiven Profileinstellungen überschreiben und die Einstellungen für einzelne Befehle rückgängig machen, indem Sie den Parameter --cli-binary-format raw-in-base64-out in die Befehlszeile aufnehmen.

Das war's. Die Swagger-Definitionsdatei ist also nicht speziell base64-codiert ** --cli-binäres Format raw-in-base64-out ** Fügen wir einen Parameter hinzu.

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

Ich bestand.

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

Ich konnte den Rest der Schritte ohne besondere Probleme ausführen.

Ich werde Github ein Problem mit den zu aktualisierenden Teilen wie AWS CLI und Dockerfile geben. Es wird einige Zeit dauern, bis die Tutorial-Website (insbesondere die japanische Version) angezeigt wird Bitte bezeichnen Sie es als Hilfsdokument.

Sie können also Schritt für Schritt die Erstellung von Cloud-nativen Apps erleben Diejenigen, die ECS, API Gateway, Cognito, Kinesis Firehose usw. lernen möchten, während sie ihre Hände bewegen, Versuch es bitte! !! !!

Recommended Posts

AWS Official "Erstellen moderner Webanwendungen" Praktische Hamari
Weitere Informationen zu AWS-Webanwendungen ohne Server