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.
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.
(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
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.
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.
Der Name kann alles sein. Diesmal ist es "oss-ssi-include".
Es wird davon ausgegangen, dass die Zugriffsberechtigungen entsprechend festgelegt sind.
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.
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
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"
}
]
}
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