[PYTHON] Ich wollte die Google-Tabelle mit AWS Lambda betreiben, also habe ich es versucht [Teil 2]

Überblick

Dies ist eine Fortsetzung des vorherigen Artikels. Das letzte Mal habe ich die untere Hälfte erstellt, also werde ich dieses Mal die obere Hälfte erstellen

Untitled (1).png

Serverlose Framework-Umgebung

Betriebsumgebung

npm (6.14.8): Wenn es nicht alt ist ... serverlos (2.8.0): Wenn es sich um eine 2.x.x-Serie handelt Python (3.8.2): Wenn es sich um eine 3.8-Serie handelt

Verfassung

Unten für diejenigen, die das serverlose Framework kennen, für diejenigen, die Python irgendwie verstehen können Die Erklärung wird weggelassen. Bitte sehen Sie nur als Referenz.

functions/layers/serverless.yml  #Konfigurationsdatei
functions/layers/package.json   #Paketbezogen
functions/layers/requirements.txt #Paketbezogen
functions/layers/python/util.py  #Gemeinsame Funktion

functions/main/serverless.yml  #Konfigurationsdatei
functions/main/handler.py        #Hauptgericht von Lambda

Es ist praktisch, Ebenen zu erstellen, wenn viele Pakete vorhanden sind. Referenz Aws Lambda Layer

Beschreibung jedes Moduls

functions/layers/serverless.yml

service: goole-test-layer
frameworkVersion: "2"

plugins:
  - serverless-python-requirements

custom:
  defaultStage: dev
  pythonRequirements:
    dockerizePip: true
    layer: true

provider:
  name: aws
  runtime: python3.8
  stage: ${opt:stage, self:custom.defaultStage}
  region: ap-northeast-1
  environment:
    TZ: Asia/Tokyo

package:
  exclude:
    - ./node_modules/** #Definieren Sie, wo sich das Paket befindet

layers:
  LayersCommon:
    path: "./"  #Wenn Sie es in einen Ordner namens Python legen, kann es als allgemeine Funktion von der Lambda-Seite aufgerufen werden.
    compatibleRuntimes:
      - python3.8

resources:
  Outputs:
    PythonRequirementsLambdaLayerExport:
      Value:
        Ref: PythonRequirementsLambdaLayer ##Wird in den Einstellungen auf der Funktionsseite verwendet
    LayersCommonLambdaLayerExport:
      Value:
        Ref: LayersCommonLambdaLayer ##Wird in den Einstellungen auf der Funktionsseite verwendet

functions/layers/package.json

{
  "name": "sample",
  "description": "",
  "version": "0.1.0",
  "dependencies": {},
  "devDependencies": {
    "serverless-python-requirements": "^5.1.0"
  }
}

functions/layers/requirements.txt

boto3
botocore
gspread
oauth2client

functions/main/serverless.yml


service: goole-test
frameworkVersion: "2"

custom:
  defaultStage: dev
  sampleS3BucketName:
    Fn::Join:
      - ""
      - - ${self:service}-
        - ${self:provider.stage}-
        - Ref: AWS::AccountId
  ##Ebeneneinstellungen[packege]
  requirements_service: goole-test-layer
  requirements_export: PythonRequirementsLambdaLayerExport
  requirements_layer: ${cf:${self:custom.requirements_service}-${self:provider.stage}.${self:custom.requirements_export}}
  ##Ebeneneinstellungen[common]
  layers_common_service: goole-test-layer
  layers_common_export: LayersCommonLambdaLayerExport
  layers_common: ${cf:${self:custom.layers_common_service}-${self:provider.stage}.${self:custom.layers_common_export}}

provider:
  name: aws
  runtime: python3.8
  stage: ${opt:stage, self:custom.defaultStage}
  region: ap-northeast-1
  logRetentionInDays: 30
  environment:
    KEYNAME : "/google/access_key" #Speicherort des erstellten Schlüssels
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "s3:ListBucket"
        - "s3:GetObject"
        - "s3:PutObject"
      Resource:
        - Fn::Join: ["", ["arn:aws:s3:::", { "Ref": "S3Bucket" }]]
        - Fn::Join: ["", ["arn:aws:s3:::", { "Ref": "S3Bucket" }, "/*"]]
    - Effect: Allow
      Action:
        - secretsmanager:GetSecretValue
      Resource:
        - "*" #Die Berechtigungskontrolle ist durch Angabe des Arns des Secrets Managers möglich

functions:
  google_test:
    handler: handler.google_test
    memorySize: 512
    timeout: 900
    layers:
      - ${self:custom.requirements_layer}
      - ${self:custom.layers_common}
    events:
      - s3:                 #Legen Sie das S3-Erstellungsobjekt fest, das derzeit häufig verwendet wird
          bucket:
            Ref: S3Bucket
          event: s3:ObjectCreated:*
          existing: true
          rules:
            - suffix: .csv

resources:
  Resources:
    S3Bucket:                           #Erstellen Sie S3
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:custom.sampleS3BucketName}

functions/main/hander.py Ich trage es seitwärts und schreibe alles in ein Modul, aber bitte teilen Sie die Datei für jede Funktion ...

import json
import os
import boto3
from botocore.exceptions import ClientError
import base64
import gspread
from oauth2client.service_account import ServiceAccountCredentials


def get_secret():
    #Dies entspricht fast dem Beispielcode beim Erstellen von Secrets Manager
    try:
        secret = None
        decoded_binary_secret = None

        secret_name = os.environ['KEYNAME']
        region_name = "ap-northeast-1"

        # Create a Secrets Manager client
        session = boto3.session.Session()
        client = session.client(
            service_name='secretsmanager',
            region_name=region_name
        )

        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )

    except ClientError as e:
        if e.response['Error']['Code'] == 'DecryptionFailureException':
            raise e
        elif e.response['Error']['Code'] == 'InternalServiceErrorException':
            raise e
        elif e.response['Error']['Code'] == 'InvalidParameterException':
            raise e
        elif e.response['Error']['Code'] == 'InvalidRequestException':
            raise e
        elif e.response['Error']['Code'] == 'ResourceNotFoundException':
            raise e
    else:
        if 'SecretString' in get_secret_value_response:
            secret = get_secret_value_response['SecretString']
        else:
            decoded_binary_secret = base64.b64decode(
                get_secret_value_response['SecretBinary'])

    # Your code goes here.
    return decoded_binary_secret.decode()


def connect_gspread(jsonf, key):
    scope = ['https://spreadsheets.google.com/feeds',
             'https://www.googleapis.com/auth/drive']
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        jsonf, scope)
    gc = gspread.authorize(credentials)
    SPREADSHEET_KEY = key
    worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1
    return worksheet


def google_test(event, context):

    #Weil es als Datei an die API übergeben wird/Lassen Sie uns zu tmp ausgeben.
    jsonf = "/tmp/google-access.json"

    with open(jsonf, mode='w') as f:
        f.write(get_secret())

    spread_sheet_key = '1o3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    ws = connect_gspread(jsonf, spread_sheet_key)

    #Setzen Sie hoge1 in Zelle A1 ein
    ws.update_cell(1, 1, "hoge1")

    body = {
        "message": "{} !".format("finished ."),
        "input": event
    }

    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }

    return response

Bereitstellen

##Bereitstellung aus Ebenen
cd functions/layers
npm install
pip install -r requirements.txt
sls deploy

##Stellen Sie die Hauptfunktion bereit
cd functions/main
sls deploy

Lauf! !! !!

Hoge1 hat die A1-Zelle sicher betreten!

スクリーンショット 2020-10-26 16-37-46.png

So konnte ich die Tabelle von AWS Lambda aktualisieren. Nun, soll ich es in GAS schreiben? Es gibt auch einen Tsukkomi, aber wenn Sie so etwas machen wollen Wir würden uns freuen, wenn Sie sich darauf beziehen könnten.

Hab ein gutes AWS-Leben!

Recommended Posts

Ich wollte die Google-Tabelle mit AWS Lambda betreiben, also habe ich es versucht [Teil 2]
AWS Lambda unterstützt jetzt Python, also habe ich es versucht
Da es Doppelgenger gab, habe ich versucht, es mit künstlicher Intelligenz zu unterscheiden (lacht) (Teil 1)
Ich habe versucht, AWS Lambda mit anderen Diensten zu verbinden
Ich habe versucht, Linux mit Discord Bot zu betreiben
Als ich versuchte, eine VPC mit AWS CDK zu erstellen, konnte ich es aber nicht schaffen
Ich habe versucht, Twitter Scraper mit AWS Lambda zu verwenden, aber es hat nicht funktioniert.
Ich wollte die Anzahl der Zeilen in mehreren Dateien wissen und versuchte, sie mit einem Befehl abzurufen
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
[Einführung in AWS] Ich habe versucht, mit der Sprach-Text-Konvertierung zu spielen ♪
Es war ein Leben, das ich auf AWS Lambda OCR wollte, um die Charaktere zu lokalisieren.
Ich wollte den Motor mit einer Raspeltorte laufen lassen, also habe ich versucht, das Motor Driver Board von Waveshare zu verwenden
Da es Doppelgenger gab, habe ich versucht, es mit künstlicher Intelligenz zu unterscheiden (lacht) (Teil 2)
[AWS / Tello] Ich habe versucht, die Drohne mit meiner Stimme Part2 zu bedienen
Ein Memorandum beim automatischen Erwerb mit Selen
Ich habe versucht, es zu erweitern, damit die Datenbank mit der Analysesoftware von Wiire verwendet werden kann
Ich habe versucht, alles zu automatisieren, einschließlich der zweistufigen Authentifizierung von Google OAuth
Ich möchte Druckinformationen (erhalten mit Beautiful Soup) mit einem Diagramm an Slack with Python senden (+ Ich möchte sie mit Google Spread Sheet verwalten).
[AWS / Tello] Ich habe versucht, die Drohne mit meiner Stimme Part1 zu bedienen
Ich habe versucht, Zabbix Server über einen Ausführungsfehler der AWS Lambda-Funktion zu informieren
Ich möchte es mit Python Lambda Django machen, aber ich werde aufhören
[AWS] [GCP] Ich habe versucht, die Verwendung von Cloud-Diensten mit Python zu vereinfachen
[Zaif] Ich habe versucht, den Handel mit virtuellen Währungen mit Python zu vereinfachen
Ich habe versucht, einen URL-Verkürzungsdienst mit AWS CDK serverlos zu machen
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich wollte ABC160 mit Python lösen
Ich möchte mit aws mit Python spielen
Ich habe versucht, DeepPose mit PyTorch PartⅡ zu implementieren
Ich habe versucht, CVAE mit PyTorch zu implementieren
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
Ich habe versucht, TSP mit QAOA zu lösen
Ich wollte ABC172 mit Python lösen
Ich wollte unbedingt mit Selen kopieren
Ich habe gerade FizzBuzz mit AWS Lambda gemacht
Ich habe versucht, mein eigenes Modul zu veröffentlichen, damit ich es per Pip installieren kann
Als ich versuchte, das Root-Passwort mit ansible zu ändern, konnte ich nicht darauf zugreifen.
Ich habe versucht, Java mit Termux unter Verwendung von Termux Arch zu verwenden, aber es hat nicht funktioniert
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Ich habe versucht, die Kosten zu senken, indem ich EC2 in einer Charge mit AWS Lambda gestartet / gestoppt habe
[Einführung in AWS] Ich habe versucht, eine Konversations-App zu portieren und mit text2speech @ AWS playing zu spielen
Ich habe versucht, eine Umgebung zu erstellen, um regelmäßig mit Selenium mit AWS Fargate zu überprüfen
Ich habe die Größenänderung von TensorFlow nicht verstanden und sie daher visuell zusammengefasst.
Ich habe versucht, Kanas handschriftliche Zeichenerkennung Teil 3/3 Zusammenarbeit mit der GUI mithilfe von Tkinter durchzuführen
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe "License OCR" mit der Google Vision API ausprobiert
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich wollte mit der Bezier-Kurve spielen
Ich wollte Python 3.4.3 mit Homebrew + pyenv installieren
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, das Überleben der Titanic mit PyCaret vorherzusagen