本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 Lambda 搭配基礎設施即程式碼 (IaC)
Lambda 提供多種方式來部署程式碼和建立函數。例如,您可以使用 Lambda 主控台或 AWS Command Line Interface (AWS CLI) 手動建立或更新 Lambda 函數。除了這些手動選項之外,還 AWS 提供許多解決方案,可使用基礎架構即程式碼 (IaC) 部署 Lambda 函數和無伺服器應用程式。使用 IaC,您可以使用程式碼佈建和維護 Lambda 函數和其他 AWS 資源,而不是使用手動程序和設定。
大多數情況下,Lambda 函數不會單獨執行。相反地,它們是具有其他資源 (例如資料庫、佇列和儲存體) 的無伺服器應用程式的一部分。使用 IaC,您可以自動化部署程序,以快速且重複地部署和更新涉及許多不同資源的整個無伺服器應用程式。 AWS 這種方法可加快您的開發週期,使組態管理更加輕鬆,並確保您的資源每次都以相同的方式部署。
用於 Lambda 的 IaC 工具
若要使用 IaC 部署 Lambda 函數和無伺服器應用程式,請 AWS 提供許多不同的工具和服務。
AWS CloudFormation 是建立和設定雲端資源所 AWS 提供的第一個服務。您可以使用 AWS CloudFormation建立文字範本來定義基礎結構和程式碼。隨著 AWS 引入更多的新服務和創建 AWS CloudFormation 模板的複雜性增加,另外兩個工具被釋放。 AWS SAM 是另一個用於定義無伺服器應用程式的範本架構。 AWS Cloud Development Kit (AWS CDK) 這是使用許多常用程式設計語言中的程式碼結構來定義和佈建基礎結構的程式碼優先方法。
使用 AWS SAM 和 AWS CDK,可在幕後 AWS CloudFormation 運作以建置和部署您的基礎結構。下圖說明這些工具之間的關係,圖表後面的段落說明它們的主要功能。
![圖表顯示如何使用 AWS SAM 以及 AWS CDK 部署 AWS 資源和程式碼 AWS CloudFormation](images/IaC_tools.png)
-
AWS CloudFormation-使用描述 AWS 資源及其屬性的YAML或模JSON板來建模和設置資源。 CloudFormation CloudFormation 以安全、可重複的方式佈建您的資源,讓您無需手動步驟即可經常建置基礎架構和應用程式。當您變更組態時, CloudFormation 決定更新堆疊所要執行的正確作業。 CloudFormation 甚至可以回滾更改。
-
AWS Serverless Application Model (AWS SAM)- AWS SAM 是用於定義無服務器應用程序的開源框架。 AWS SAM 範本使用簡寫語法來定義函數APIs、資料庫和事件來源對映,每個資源只需幾行 text (YAML)。在部署期間,將語法 AWS SAM 轉換並擴充為 AWS SAM AWS CloudFormation 語法。因此,任何 CloudFormation 語法都可以添加到 AWS SAM 模板中。這提供了 AWS SAM 所有功能 CloudFormation,但配置行較少。
-
AWS Cloud Development Kit (AWS CDK)-使用 AWS CDK,您可以使用程式碼結構來定義基礎結構,並透過 AWS CloudFormation佈建。 AWS CDK 可讓您建立應用程式基礎結構的 TypeScript模型,使用 Python、Java、. NET和 Go (在開發人員預覽中) 使用您現有IDE的測試工具和工作流程模式。您可以獲得的所有好處 AWS CloudFormation,包括可重複部署、輕鬆復原和漂移偵測。
AWS 還提供了一種稱為 AWS 應用程式編寫器 使用簡單的圖形界面開發 IaC 模板的服務。使用「應用程式撰寫器」,您可以透過 AWS 服務 在視覺化畫布中拖曳、分組和連線來設計應用程式架構。然後,應用程式撰寫器會從您的設計建立 AWS CloudFormation 範本或範本,供您用來部署應用程式。 AWS SAM
在下面的 開始使用適用於 Lambda 的 IaC 章節中,您可以使用應用程式編寫器,根據現有的 Lambda 函數為無伺服器應用程式開發範本。
開始使用適用於 Lambda 的 IaC
在本教學課程中,您可以透過從現有的 Lambda 函數建立 AWS SAM 範本,然後新增其 AWS 他資源,在應用程式撰寫器中建置無伺服器應用程式,開始將 IaC 與 Lambda 搭配使用。
如果您想開始執行 AWS SAM 或 AWS CloudFormation 教學課程,以了解如何在不使用應用程式撰寫器的情況下使用範本,您可以在本頁結尾的後續步驟區段中找到其他資源的連結。
當您執行本教程時,您將學習一些基本概念,如何在中指定 AWS 資源 AWS SAM。您也將學習如何使用應用程式撰寫器來建置可使用 AWS SAM 或 AWS CloudFormation部署的無伺服器應用程式。
請執行下列步驟以完成本教學課程:
-
建立範例 Lambda 函數
-
使用 Lambda 主控台來檢視函數的 AWS SAM 範本
-
將函數的配置導出到 AWS 應用程式編寫器 並根據功能的配置設計一個簡單的無服務器應用程序
-
儲存可用來部署無伺服器應用程式的更新 AWS SAM 範本
在此後續步驟區段中,您會找到可用來進一步瞭解 AWS SAM 和應用程式撰寫器的資源。這些資源包括更進階教學課程的連結,這些教學課程會教導您如何使 AWS SAM用.
必要條件
在本教學課程中,您會使用應用程式編寫器的本機同步處理功能,將範本和程式碼檔案儲存到本機建置機器。若要使用此功能,您需要支援「檔案系統存取」的瀏覽器API,該瀏覽器可讓 Web 應用程式在本機檔案系統中讀取、寫入和儲存檔案。我們建議使用 Google Chrome 或 Microsoft Edge。如需有關檔案系統存取的詳細資訊API,請參閱何謂檔案系統存取API?
建立 Lambda 函數
在此第一步驟中,將會建立 Lambda 函數,可用於完成本教學課程的其餘部分。為了簡化事情,您可以使用 Lambda 主控台,使用 Python 3.11 執行期來建立基本的「Hello world」函數。
若要使用主控台建立「Hello world」Lambda 函數
-
開啟 Lambda 主控台
。 -
選擇建立函數。
-
保持選取從頭開始撰寫,然後在基本資訊之下的函數名稱中輸入
LambdaIaCDemo
。 -
針對執行期,選取 Python 3.11。
-
選擇建立函數。
檢視功能的 AWS SAM 範本
在您將函數組態匯出至應用程式編寫器之前,請使用 Lambda 主控台以 AWS SAM 範本的方式檢視函數目前的組態。按照本節中的步驟操作,您將了解 AWS SAM 範本的結構,以及如何定義 Lambda 函數等資源以開始指定無伺服器應用程式。
檢視函數 AWS SAM 樣板的步驟
-
開啟 Lambda 主控台中的函數頁面
。 -
選擇您剛建立的函數 (
LambdaIaCDemo
)。 -
在函數概觀窗格中,選擇範本。
代替表示函數配置的圖表,您將看到一個函數的 AWS SAM 模板。範本看起來應該如下所示。
# This AWS SAM template has been generated from your function's # configuration. If your function has one or more triggers, note # that the AWS resources associated with these triggers aren't fully # specified in this template and include placeholder values.Open this template # in AWS Application Composer or your favorite IDE and modify # it to specify a serverless application with other AWS resources. AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: An AWS Serverless Specification template describing your function. Resources: LambdaIaCDemo: Type: AWS::Serverless::Function Properties: CodeUri: . Description: '' MemorySize: 128 Timeout: 3 Handler: lambda_function.lambda_handler Runtime: python3.11 Architectures: - x86_64 EventInvokeConfig: MaximumEventAgeInSeconds: 21600 MaximumRetryAttempts: 2 EphemeralStorage: Size: 512 RuntimeManagementConfig: UpdateRuntimeOn: Auto SnapStart: ApplyOn: None PackageType: Zip Policies: Statement: - Effect: Allow Action: - logs:CreateLogGroup Resource: arn:aws:logs:us-east-1:123456789012:* - Effect: Allow Action: - logs:CreateLogStream - logs:PutLogEvents Resource: - >- arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/LambdaIaCDemo:*
讓我們花點時間來看看你的函數的YAML模板,並理解一些關鍵概念。
範本以宣告 Transform: AWS::Serverless-2016-10-31
開始。此聲明是必需的,因為在幕後, AWS SAM 模板是通過部署的 AWS CloudFormation。使用 Transform
陳述式將範本識別為 AWS SAM 範本檔案。
在 Transform
聲明之後伴隨的 Resources
部分。這是您要使用 AWS SAM 範本部署的 AWS 資源的定義位置。 AWS SAM 範本可以包含 AWS SAM 資源和 AWS CloudFormation 資源的組合。這是因為在部署期間, AWS SAM 範本會展開為 AWS CloudFormation 範本,因此任何有效的 AWS CloudFormation 語法都可以新增至 AWS SAM 範本。
目前,範本 Resources
區段中只定義了一個資源,即您的 Lambda 函數 LambdaIaCDemo
。若要將 Lambda 函數新增至 AWS SAM 範本,請使用資AWS::Serverless::Function
源類型。Lambda 函數資源的 Properties
定義函數的執行期、函數處理常式和其他組態選項。此處也定義了函數源代碼的路徑, AWS SAM 該路徑應該用於部署該函數。若要進一步了解中的 Lambda 函數資源 AWS SAM,請參閱AWS開發人員指AWS SAM 南中的:: 無伺服器:: 函數。
除了函數屬性和配置之外,該模板還為您的函數指定 AWS Identity and Access Management (IAM)策略。此政策授予您將日誌寫入 Amazon CloudWatch 日誌的函數權限。當您在 Lambda 主控台中建立函數時,Lambda 會自動將此政策附加至您的函數。若要進一步了解如何為 AWS SAM 範本中的函數指定IAM原則,請參閱開發人員指南:AWS: 無伺服器:: Function 頁面上的policies
屬性。AWS SAM
若要深入瞭解範本結構,請參閱 AWS SAM AWS SAM 範本結構。
用於設 AWS 應用程式編寫器 計無伺服器應用程式
若要開始使用函數 AWS SAM 範本做為起點來建置簡單的無伺服器應用程式,請將函數組態匯出至應用程式撰寫器,然後啟動應用程式撰寫器的本機同步處理模式。本地同步會自動將函數的代碼和 AWS SAM 模板保存到本地構建計算機,並在您在應用程序撰寫器中添加其他 AWS 資源時保持保存的模板保持同步。
若要將函數匯出至應用程式編寫器
-
在函數概觀窗格中,選擇匯出至應用程式編寫器。
若要將函數的組態和程式碼匯出至應用程式編寫器,Lambda 會在您的帳戶中建立 Amazon S3 儲存貯體來暫時存放此資料。
-
在對話方塊中,選擇確認並建立專案以接受此儲存貯體的預設名稱,並將函數的設定和程式碼匯出至應用程式編寫器。
-
(選擇性) 若要為 Lambda 建立的 Amazon S3 儲存貯體選擇其他名稱,請輸入新名稱,然後選擇確認並建立專案。Amazon S3 儲存貯體的名稱必須是全域唯一的,並遵循儲存貯體命名規則。
選取確認並建立專案會開啟應用程式編寫器主控台。在畫布上,您將看到您 Lambda 函數。
-
從選單下拉式清單中選擇啟用本機同步。
-
在開啟的對話方塊中,選擇選取資料夾,然後選取本機建置機器上的資料夾。
-
選擇啟用以啟用本機同步。
若要將函數匯出至「應用程式撰寫器」,您需要使用某些API動作的權限。如果您無法匯出函數,請見 所需的許可 並確認您有所需的許可。
注意
標準 Amazon S3 定價
若要避免額外費用新增至您的 AWS 帳戶,請在將函數匯出至應用程式撰寫器之後,依照刪除值區中的指示執行。如需 Lambda 所建立 Amazon S3 儲存貯體的詳細資訊,請參閱 AWS Lambda 搭配使用 AWS 應用程式編寫器。
在應用程式編寫器中設計無伺服器應用程式
啟用本機同步之後,您在「應用程式撰寫器」中所做的變更會反映在儲存在本機建置電腦上的 AWS SAM 範本中。您現在可以將其他 AWS 資源拖放到「應用程式撰寫器」畫布上,以建置您的應用程式。在此範例中,您將 Amazon SQS 簡單佇列新增為 Lambda 函數的觸發程序,以及新增 DynamoDB 表格供函數寫入資料。
-
執行下列動作,將 Amazon SQS 觸發器新增至您的 Lambda 函數:
-
在資源面板的搜尋欄位中,輸入
SQS
。 -
將SQS佇列資源拖曳到畫布上,並將其放置在 Lambda 函數的左側。
-
選擇詳細資訊,然後為邏輯 ID 輸入
LambdaIaCQueue
。 -
選擇 Save (儲存)。
-
按一下SQS佇列卡上的訂閱 Connect 埠,SQS然後將它拖曳至 Lambda 函數卡上的左側連接埠,即可連接 Amazon 和 Lambda 資源。兩個資源之間出現一條線表示連線成功。應用程式編寫器也會在畫布底部顯示訊息,指示出兩個資源已成功連線。
-
-
執行下列動作,為您的 Lambda 函數新增 Amazon DynamoDB 資料表,以便將資料寫入:
-
在資源面板的搜尋欄位中,輸入
DynamoDB
。 -
將 DynamoDB 資料表資源拖曳到畫布上,並將其放置在 Lambda 函數的右側。
-
選擇詳細資訊,然後為邏輯 ID 輸入
LambdaIaCTable
。 -
選擇 Save (儲存)。
-
按一下 Lambda 函數卡的右側連接埠,然後將其拖曳至 DynamoDB 卡上的左側連接埠,藉此將 DynamoDB 資料表連接至 Lambda 函數。
-
現在您已新增這些額外資源,讓我們來看看應用程式撰寫器已建立的更新 AWS SAM 範本。
若要檢視更新的 AWS SAM 範本
-
在應用程式編寫器畫布上,選擇範本以從畫布檢視切換至範本檢視。
您的 AWS SAM 範本現在應該包含下列其他資源和屬性:
-
帶有標識符的 Amazon SQS 隊列
LambdaIaCQueue
LambdaIaCQueue: Type: AWS::SQS::Queue Properties: MessageRetentionPeriod: 345600
使用應用程式撰寫器新增 Amazon SQS 佇列時,應用程式撰寫器會設定
MessageRetentionPeriod
屬性。您也可以選取SQS佇列卡上的 [詳細資料],然後核取或取消勾選 [FFO] 佇列來設定FifoQueue
屬性。若要設定佇列的其他屬性,您可以手動編輯範本以新增它們。若要進一步瞭解資
AWS::SQS::Queue
源及其可用屬性,請參閱《AWS CloudFormation 使用指南》中的AWS SQS::: Queue。 -
Lambda 函數定義中的
Events
屬性,可將 Amazon SQS 佇列指定為函數的觸發程序Events: LambdaIaCQueue: Type: SQS Properties: Queue: !GetAtt LambdaIaCQueue.Arn BatchSize: 1
此
Events
屬性由事件類型和一組依賴於類型的屬性組成。若要了解不同項目, AWS 服務 您可以設定以觸發 Lambda 函數和可設定的屬性,請參閱開發AWS SAM 人員指南EventSource中的。 -
具有識別碼
LambdaIaCTable
的 DynamoDB 資料表LambdaIaCTable: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: id AttributeType: S BillingMode: PAY_PER_REQUEST KeySchema: - AttributeName: id KeyType: HASH StreamSpecification: StreamViewType: NEW_AND_OLD_IMAGES
使用應用程式編寫器新增 DynamoDB 資料表時,您可以選擇 DynamoDB 資料表卡片上的「詳細資料」並編輯索引鍵值來設定資料表的索引鍵。應用程式編寫器也會設定許多其他屬性的預設值,包括
BillingMode
和StreamViewType
。若要進一步瞭解這些屬性和您可以新增至 AWS SAM 範本的其他屬性,請參閱使用者指南中的AWS:: DynamoDB:: Table。AWS CloudFormation
-
一項新IAM政策,授予您在新增的 DynamoDB 表上執行CRUD作業的函數權限。
Policies: ... - DynamoDBCrudPolicy: TableName: !Ref LambdaIaCTable
完整的最終 AWS SAM 範本應如下所示。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: An AWS Serverless Specification template describing your function. Resources: LambdaIaCDemo: Type: AWS::Serverless::Function Properties: CodeUri: . Description: '' MemorySize: 128 Timeout: 3 Handler: lambda_function.lambda_handler Runtime: python3.11 Architectures: - x86_64 EventInvokeConfig: MaximumEventAgeInSeconds: 21600 MaximumRetryAttempts: 2 EphemeralStorage: Size: 512 RuntimeManagementConfig: UpdateRuntimeOn: Auto SnapStart: ApplyOn: None PackageType: Zip Policies: - Statement: - Effect: Allow Action: - logs:CreateLogGroup Resource: arn:aws:logs:us-east-1:594035263019:* - Effect: Allow Action: - logs:CreateLogStream - logs:PutLogEvents Resource: - arn:aws:logs:us-east-1:594035263019:log-group:/aws/lambda/LambdaIaCDemo:* - DynamoDBCrudPolicy: TableName: !Ref LambdaIaCTable Events: LambdaIaCQueue: Type: SQS Properties: Queue: !GetAtt LambdaIaCQueue.Arn BatchSize: 1 Environment: Variables: LAMBDAIACTABLE_TABLE_NAME: !Ref LambdaIaCTable LAMBDAIACTABLE_TABLE_ARN: !GetAtt LambdaIaCTable.Arn LambdaIaCQueue: Type: AWS::SQS::Queue Properties: MessageRetentionPeriod: 345600 LambdaIaCTable: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: id AttributeType: S BillingMode: PAY_PER_REQUEST KeySchema: - AttributeName: id KeyType: HASH StreamSpecification: StreamViewType: NEW_AND_OLD_IMAGES
使用 AWS SAM (選用) 部署您的無伺服器應用程式
如果您想 AWS SAM 要使用您剛在應用程式撰寫器中建立的範本來部署無伺服器應用程式,您必須先安裝. AWS SAM CLI 若要執行這項操作,請遵循安裝中的指示 AWS SAM CLI。
在部署應用程式之前,您也需要更新應用程式編寫器與範本一起儲存的函數程式碼。目前,應用程式編寫器儲存的 lambda_function.py
檔案只包含 Lambda 在建立函數時提供的基本 'Hello world' 程式碼。
若要更新您的函數程式碼,請複製下列程式碼,並將其貼到儲存至本機建置機器的應用程式編寫器 lambda_function.py
檔案中。當您啟動本機同步模式時,您已指定應用程式編寫器要儲存此檔案的目錄。
此程式碼接受來自您在應用程式撰寫器中建立之 Amazon SQS 佇列的訊息中的金鑰值組。如果索引鍵和值都是字串,則程式碼會使用它們將項目寫入範本中定義的 DynamoDB 資料表。
import boto3 import os import json # define the DynamoDB table that Lambda will connect to tablename = os.environ['LAMBDAIACTABLE_TABLE_NAME'] # create the DynamoDB resource dynamo = boto3.client('dynamodb') def lambda_handler(event, context): # get the message out of the SQS event message = event['Records'][0]['body'] data = json.loads(message) # write event data to DDB table if check_message_format(data): key = next(iter(data)) value = data[key] dynamo.put_item( TableName=tablename, Item={ 'id': {'S': key}, 'Value': {'S': value} } ) else: raise ValueError("Input data not in the correct format") # check that the event object contains a single key value # pair that can be written to the database def check_message_format(message): if len(message) != 1: return False key, value = next(iter(message.items())) if not (isinstance(key, str) and isinstance(value, str)): return False else: return True
若要部署您的無伺服器應用程式
若要使用部署您的應用程式 AWS SAM CLI,請執行下列步驟。若要讓您的函數正確建置和部署,Python 第 3.11 版本必須安裝在您的建置機器和 PATH
。
-
從應用程式編寫器儲存
template.yaml
和lambda_function.py
檔案的目錄執行下列命令。sam build
此命令會收集應用程式的建置成品,並將它們放置在適當的格式和位置以進行部署。
-
若要部署應用程式並建立 AWS SAM 範本中指定的 Lambda SQS、Amazon 和 DynamoDB 資源,請執行下列命令。
sam deploy --guided
使用該
--guided
標誌意味著 AWS SAM 將顯示提示,以引導您完成部署過程。對於此部署,請按 Enter 接受預設選項。
在部署程序期間, AWS SAM 會在您的中建立下列資源 AWS 帳戶:
-
一個名為的 AWS CloudFormation 堆棧
sam-app
-
名稱格式為
sam-app-LambdaIaCDemo-
的 Lambda 函數99VXPpYQVv1M
-
名稱格式的 Amazon SQS 隊列
sam-app-LambdaIaCQueue-
xL87VeKsGiIo
-
名稱格式為
sam-app-LambdaIaCTable-
的 DynamoDB 資料表CN0S66C0VLNV
AWS SAM 此外,還會建立必要的IAM角色和政策,以便 Lambda 函數可以讀取 Amazon SQS 佇列中的訊息,並在 DynamoDB 表格上執行CRUD操作。
若要進一步了解如 AWS SAM 何使用部署無伺服器應用程式,請參閱後續步驟本節中的資源。
測試已部署的應用程式 (選擇性)
若要確認您的無伺服器應用程式是否正確部署,請將訊息傳送至包含金鑰值組的 Amazon SQS 佇列,並檢查 Lambda 是否使用這些值將項目寫入 DynamoDB 資料表。
測試您的無伺服器應用程式
-
開啟 Amazon SQS 主控台的 [佇列
] 頁面,然後選取從範本 AWS SAM 建立的佇列。名稱具有格式 sam-app-LambdaIaCQueue-
。xL87VeKsGiIo
-
選擇發送和接收消息,然後JSON將以下內容粘貼到消息正文中發送消息部分。
{ "myKey": "myValue" }
-
選擇 傳送訊息 。
將訊息傳送至佇列會導致 Lambda 透過範本 AWS SAM 中定義的事件來源映射調用您的函數。若要確認 Lambda 已如預期調用您的函數,請確認項目已新增至 DynamoDB 資料表中。
-
開啟 DynamoDB 主控台的 資料表
頁面,然後選擇資料表。名稱具有格式 sam-app-LambdaIaCTable-
。CN0S66C0VLNV
-
選擇 探索資料表項目 。在 Items returned 窗格中,應該會看到一個包含 id
myKey
和 數值myValue
的項目。
後續步驟
若要進一步了解如何搭配使用應用程式撰寫器 AWS SAM 和 AWS CloudFormation,請先使用AWS CloudFormation 和使用應用程式撰寫器 AWS SAM。
如需用來部署應用 AWS SAM 程式撰寫器中設計的無伺服器應用程式的指導式教學課程,我們也建議您在AWS 無伺服器模式
AWS SAM 提供命令列介面 (CLI),您可以將其與 AWS SAM 範本和支援的第三方整合搭配使用,以建置和執行無伺服器應用程式。使用 AWS SAM CLI,您可以建置和部署應用程式、執行本機測試和偵錯、設定 CI/CD 管線等等。若要進一步了解如何使用 AWS SAM CLI,請參閱開AWS Serverless Application Model發人員指南 AWS SAM中的入門。
若要了解如何使用 AWS CloudFormation 主控台使用 AWS SAM 範本部署無伺服器應用程式,請從《使用AWS CloudFormation 者指南》中的使用 AWS CloudFormation 主控台開始。
Lambda 與應用程式編寫器整合的支援區域
下列項目支援 Lambda 與應用程式撰寫器整合 AWS 區域:
-
美國東部 (維吉尼亞北部)
-
美國東部 (俄亥俄)
-
美國西部 (加利佛尼亞北部)
-
美國西部 (奧勒岡)
-
非洲 (開普敦)
-
亞太區域 (香港)
-
亞太區域 (海德拉巴)
-
亞太區域 (雅加達)
-
亞太區域 (墨爾本)
-
亞太區域 (孟買)
-
亞太區域 (大阪)
-
亞太區域 (首爾)
-
亞太區域 (新加坡)
-
亞太區域 (雪梨)
-
亞太區域 (東京)
-
加拿大 (中部)
-
歐洲 (法蘭克福)
-
歐洲 (蘇黎世)
-
歐洲 (愛爾蘭)
-
歐洲 (倫敦)
-
歐洲 (斯德哥爾摩)
-
中東 (UAE)