[PYTHON] [Alibaba Cloud] Machen Sie so etwas wie SSI auch mit OSS / Function Compute

TL;DR Letztes Mal wird in AWS beschriebenes HTML mit SSI (virtuell enthalten) in einem bestimmten Bucket von S3 gespeichert, und die Quellen im Include werden mit Lambda kombiniert. Ich habe einen Mechanismus entwickelt, um es in einem anderen Eimer zu speichern, aber es ist die Alibaba Cloud-Version davon.

Was ich machen wollte

Da es sich bei OSS (Object Storage Service) um einen statischen Site-Hosting-Service handelt, ist eine dynamische Verarbeitung auf der Serverseite grundsätzlich nicht möglich. Natürlich kann auch die CDN-Seite (Alibaba Cloud CDN), die das Ziel für das anschließende Caching ist, nicht verwendet werden.

In diesem Fall besteht die Standardmethode meiner Meinung nach darin, eine lokale Entwicklungsumgebung zu erstellen, diese lokal in separaten Dateien zu speichern und beim Kompilieren zu kombinieren. OSS + ist jedoch eine vorhandene Site, die ursprünglich SSI verwendet hat. Leider kann dieser Ablauf nicht in allen Projekten eingeführt werden, auch nicht bei der Übertragung auf CDN.

Wenn SSI ursprünglich verwendet wurde, habe ich versucht, es auf der Alibaba Cloud-Seite so anzupassen, dass es so verwendet werden kann, wie es ist, ohne es so zu ersetzen, wie es ist.

Was ich getan habe

(Voraussetzung ist, dass die Einstellungen für RAM und KMS, die das IAM der Alibaba Cloud-Version sind, abgeschlossen wurden.)

Grundsätzlich ist es basierend auf dem vorherigen Artikel für Alibaba Cloud angepasst. [AWS] Machen Sie SSI-ähnliche Dinge mit S3 / Lambda Ich denke, dieser Artikel von SB Cloud ist nützlich für die Einrichtung von Alibaba Cloud. Objektspeicher mit ereignisgesteuertem Dienst Fucntion Compute bearbeiten

Verfassung

Die Konfiguration ist dieselbe wie beim letzten Mal. Die einzigen Dienste, die ich verwende, sind OSS und Function Compute, wenn Sie das Alibaba Cloud CDN benötigen. SSI_alibaba.png

Einstellmethode

OSS In der Alibaba Cloud-Version gibt es nur einen Bucket zum Hochladen von Dateien. Der Prozess ist in zwei Bereiche unterteilt: ein Verzeichnis für temporäre und ein Verzeichnis für die öffentliche Verwendung.

Eimer für Öffentlichkeit / Temp

Der Name kann alles sein. Diesmal ist es "oss-ssi-include".

Jede Einstellung

Es wird davon ausgegangen, dass die Zugriffsberechtigungen entsprechend festgelegt sind.

Erstellen eines öffentlichen Verzeichnisses und eines temporären Verzeichnisses

Erstellen Sie das öffentliche Verzeichnis "dist" und das temporäre Verzeichnis "src" im Bucket, indem Sie auf die Schaltfläche "Verzeichnis erstellen" klicken.

Function Compute

Function Compute erkennt das PUT-Ereignis. Wenn SSI (Server Side Include) in der im Verzeichnis src / hochgeladenen HTML-Datei beschrieben ist, führt Function Compute die Include-Verarbeitung und das Verzeichnis dist / durch. Erstellen Sie eine Funktion zum Speichern.

Funktionscode

import json
import os
import logging
import oss2 
import re
import urllib.parse

logger = logging.getLogger()
logger.setLevel(logging.INFO)

OSS_ENDPOINT        = "oss-ap-northeast-1.aliyuncs.com"
DEST_BUCKET_NAME    = "oss-ssi-include"

def handler(event, context):
    logger.info('## ENVIRONMENT VARIABLES')
    logger.info(os.environ)
    logger.info('## EVENT')
    logger.info(event)
    
    creds = context.credentials
    auth = oss2.StsAuth(creds.accessKeyId, creds.accessKeySecret, creds.securityToken)
    evt = json.loads(event)
 
    #Schreiben Sie unten um
    input_bucket = oss2.Bucket(auth, OSS_ENDPOINT, DEST_BUCKET_NAME)

    logger.info('## INPUT BUKET')
    logger.info(input_bucket)
    
    input_key = urllib.parse.unquote_plus(evt['events'][0]['oss']['object']['key'])
    logger.info('## INPUT KEY')
    logger.info(input_key)

    try:
        #Eingabedatei abrufen
        response = input_bucket.get_object(input_key)
        logger.info(response)

        #Dateiausgabe
        output_key    = re.sub('^src/','dist/',input_key)
        logger.info('## OUTPUT KEY')
        logger.info(output_key)

        if not input_key.endswith('.html'):
            logger.info(response)
            input_bucket.put_object(output_key, response)

        else:
            input_html = response.read().decode('utf-8')
            logger.info('## input_html')
            logger.info(input_html)
            output_html = input_html
            #SSI-Beschreibung abrufen
            include_path_base = re.findall(r'<!--#include virtual="/(.*?)" -->.*?\n', input_html, flags=re.DOTALL)
            logger.info('## PATH BASE')
            logger.info(include_path_base)
            if len(include_path_base) > 0:
                for path in include_path_base:
                    include_path = path
                    logger.info('## PATH')
                    logger.info(include_path)
            
                    #SSI-Datei abrufen
                    try:
                        include = input_bucket.get_object('src/' + include_path)
                        include_html = include.read().decode('utf-8')
                        #Führen Sie SSI aus
                        output_html = output_html.replace('<!--#include virtual="/' + include_path + '" -->', include_html)
                    except ClientError:
                        pass
            

            input_bucket.put_object(output_key, output_html)

    except Exception as e:
        logger.info(e)
        raise e

Andere Einstellungen

Triggereinstellung

Triggertyp: OSS-Trigger Triggername: setzen Ereignisquelle: acs:oss:ap-northeast-1:xxxxxxxxxxxxxxxxx:ossname Ereignisse: oss: ObjectCreated: PutObject, oss: ObjectCreated: PostObject Auslöseregel: Präfix src / Rollenoperation: Wählen Sie eine vorhandene Rolle aus Bestehende Rolle: Die Rolle ist mit der folgenden im RAM festgelegten Richtlinie in Ordnung.

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "fc:InvokeFunction"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

abschließend

Letztes Mal wird in AWS beschriebenes HTML mit SSI (virtuell enthalten) in einem bestimmten Bucket von S3 gespeichert, und die Quellen im Include werden mit Lambda kombiniert. Ich habe einen Mechanismus erstellt, um es in einem anderen Eimer zu speichern, aber ich habe es vorbereitet, weil es aus verschiedenen Gründen notwendig war, es in der Alibaba Cloud zu erstellen.

Im Gegensatz zur AWS-Version wird die Datei in das temporäre Verzeichnis hochgeladen → CloudCompute verarbeitet sie → Die Datei wird im öffentlichen Verzeichnis gespeichert. Wenn Sie die Verwendung vereinfachen möchten, ist es besser, die im öffentlichen Verzeichnis gespeicherte Datei an CDN zu verteilen Ich denke es ist gut.

Wenn Sie versuchen, Informationen über Alibaba Cloud in Japan zu erhalten, wird der [Engineer Blog] von SB Cloud (https://www.sbcloud.co.jp/archive/category/techblog) empfohlen. Ich habe diesen auch als Referenz verwendet.

Aber ist das wichtig? .. Das ist alles vom Feld.

Recommended Posts

[Alibaba Cloud] Machen Sie so etwas wie SSI auch mit OSS / Function Compute
Machen Sie so etwas wie Fuzzing mit acceptRegex.py
Ich möchte die Effizienz mit Python auch in einem experimentellen System verbessern. (3) Ich möchte mit Pandas so etwas wie Excel machen
Verbinden Sie Ihre SQL Server-Datenbank mit Python mit Alibaba Cloud Function Compute