使用 AWS Lambda 在 Amazon S3 中將大型主機檔案從 EBCDIC 格式轉換為以字元分隔的 ASCII 格式 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 AWS Lambda 在 Amazon S3 中將大型主機檔案從 EBCDIC 格式轉換為以字元分隔的 ASCII 格式

創建者:路易斯古斯塔沃丹達斯 (AWS)

程式碼儲存庫:大型主機資料公用程式

環境:PoC 或試點

資料來源:IBM 光電中心檔案

目標:分隔的 ASCII 檔案

R 類型:重新平台

工作負載:IBM

技術:大型主機

AWS 服務:AWS CloudShell; AWS Lambda; Amazon S3; Amazon CloudWatch

Summary

此模式說明如何啟動 AWS Lambda 函數,該函數會自動將大型主機 EBCDIC (延伸二進位編碼的十進位交換碼) 檔案轉換為以字元分隔的 ASCII (美國資訊交換標準碼) 檔案。Lambda 函數會在 ASCII 檔案上傳至 Amazon 簡單儲存服務 (亞馬遜 S3) 儲存貯體之後執行。檔案轉換後,您可以讀取 x86 工作負載上的 ASCII 檔案,或將檔案載入到現代資料庫中。

此模式中展示的檔案轉換方法可協助您克服在現代環境中使用 EBCDIC 檔案的挑戰。以 EBCDIC 編碼的文件通常包含以二進制或打包十進制格式表示的數據,並且字段是固定長度。這些特性會造成障礙,因為現代 x86 型工作負載或分散式環境通常會使用 ASCII 編碼的資料,而且無法處理 EBCDIC 檔案。

先決條件和限制

先決條件

  • 有效的 AWS 帳戶

  • S3 儲存貯體

  • 具有管理許可的 AWS Identity and Access Management (IAM) 使用者

  • AWS CloudShell

  • Python 3.8.0 或更高版

  • 以 EBCDIC 編碼的平面檔案及其對應的資料結構,採用一般業務導向語言 (COBOL) 字帖

注意:此模式使用範例 EBCDIC 檔案 (用戶端 .txt) 及其對應的 COBOL 字帖 (COBKS05 .c py)。這兩個檔案都可以在 GitHub mainframe-data-utilities儲存庫中使用。

限制

  • COBOL 字帖通常保存多個佈局定義。該mainframe-data-utilities項目可以解析這種字帖,但無法推斷數據轉換時要考慮哪種佈局。這是因為抄本不持有這種邏輯(而是保留在 COBOL 程序上)。因此,您必須在剖析文字本之後,手動設定選取版面的規則。

  • 此模式受 Lambda 配額限制

架構

源, 技術, 堆棧

  • IBM z/OS、IBM i 和其他光電控系統

  • 含有以 EBCDIC 編碼資料的循序檔案 (例如 IBM Db2 卸載)

  • 聯邦字帖

目標技術堆疊

  • Amazon S3

  • Amazon S3 事件通知

  • IAM

  • Lambda 函數

  • Python 3.8 或更高版本

  • 大型主機資料公用程式

  • 中繼資料

  • 以字元分隔的 ASCII 檔案

目標架構

下圖顯示了將大型主機 EBCDIC 檔案轉換為 ASCII 檔案的架構。

將大型主機的 EBCDIC 檔案轉換為 ASCII 檔案的架構

該圖顯示以下工作流程:

  1. 用戶運行字帖解析器腳本將 COBOL 字帖轉換為 JSON 文件。

  2. 使用者將 JSON 中繼資料上傳到 S3 儲存貯體。這可讓資料轉換 Lambda 函數讀取中繼資料。

  3. 使用者或自動化程序會將 EBCDIC 檔案上傳到 S3 儲存貯體。

  4. S3 通知事件會觸發資料轉換 Lambda 函數。

  5. AWS 會驗證 Lambda 函數的 S3 儲存貯體讀寫許可。

  6. Lambda 會從 S3 儲存貯體讀取檔案,並在本機將檔案從 EBCDIC 轉換為 ASCII 碼。

  7. Lambda 在 Amazon 中記錄流程狀態 CloudWatch。

  8. Lambda 將 ASCII 文件寫回 Amazon S3。

注意:在將中繼資料轉換為 JSON,然後將該資料上傳到 S3 儲存貯體之後,字帖剖析器指令碼只會執行一次。初始轉換之後,任何使用上傳至 S3 儲存貯體的相同 JSON 檔案的 EBCDIC 檔案將使用相同的中繼資料。

工具

AWS 工具

  • Amazon 可 CloudWatch協助您即時監控 AWS 資源的指標,以及在 AWS 上執行的應用程式。

  • Amazon Simple Storage Service (Amazon S3) 是一種雲端型物件儲存服務,可協助您儲存、保護和擷取任何數量的資料。

  • AWS CloudShell 是以瀏覽器為基礎的殼層,您可以使用 AWS Command Line Interface (AWS CLI) (AWS CLI) 和一系列預先安裝的開發工具來管理 AWS 服務。

  • AWS Identity and Access Management (IAM) 可透過控制誰經過身份驗證和授權使用 AWS 資源,協助您安全地管理對 AWS 資源的存取。

  • AWS Lambda 是一種運算服務,可協助您執行程式碼,而不需要佈建或管理伺服器。Lambda 只會在需要時執行程式碼並自動調整規模,因此您只需按使用的運算時間付費。

其他工具

  • GitHub是一種代碼託管服務,提供協作工具和版本控制。

  • Python 是一種高級別的編程語言。

Code

此模式的代碼可在 GitHub mainframe-data-utilities存儲庫中找到。

最佳實務

請考慮下列最佳作法:

  • 在 Amazon 資源名稱 (ARN) 級別設置所需的許可。

  • 一律授與 IAM 政策的最低權限許可。如需詳細資訊,請參閱 IAM 文件中的 IAM 中的安全性最佳實務

史诗

任務描述所需技能

建立環境變數。

將下列環境變數複製到文字編輯器,然後將<placeholder>下列範例中的值取代為您的資源值:

bucket=<your_bucket_name> account=<your_account_number> region=<your_region_code>

注意:稍後您將建立 S3 儲存貯體、AWS 帳戶和 AWS 區域的參考。

若要定義環境變數,請開啟CloudShell 主控台,然後將更新的環境變數複製並貼到命令列上。

注意:每次 CloudShell 工作階段重新啟動時,您都必須重複此步驟。

一般 AWS

建立工作資料夾。

若要簡化稍後的資源清理程序,請執行下列指令 CloudShell 來在中建立工作資料夾:

mkdir workdir; cd workdir

附註:每次失去工作 CloudShell 階段的連線時,都必須將目錄變更為工作目錄 (workdir)。

一般 AWS
任務描述所需技能

為 Lambda 函數建立信任政策。

EBCDIC 轉換器在一個 Lambda 函數中運行。該函數必須具有 IAM 角色。在建立 IAM 角色之前,您必須定義可讓資源採用該政策的信任政策文件。

從 CloudShell 工作資料夾中,執行以下指令來建立原則文件:

E2ATrustPol=$(cat <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF ) printf "$E2ATrustPol" > E2ATrustPol.json
一般 AWS

建立用於 Lambda 轉換的 IAM 角色。

若要建立 IAM 角色,請從 CloudShell 工作資料夾執行以下 AWS CLI 命令:

aws iam create-role --role-name E2AConvLambdaRole --assume-role-policy-document file://E2ATrustPol.json
一般 AWS

為 Lambda 函數建立 IAM 政策文件。

Lambda 函數必須具有 S3 儲存貯體的讀寫存取權限,以及 Amazon CloudWatch 日誌的寫入許可。

若要建立 IAM 政策,請從 CloudShell 工作資料夾執行下列命令:

E2APolicy=$(cat <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "Logs", "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogStream", "logs:CreateLogGroup" ], "Resource": [ "arn:aws:logs:*:*:log-group:*", "arn:aws:logs:*:*:log-group:*:log-stream:*" ] }, { "Sid": "S3", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::%s/*", "arn:aws:s3:::%s" ] } ] } EOF ) printf "$E2APolicy" "$bucket" "$bucket" > E2AConvLambdaPolicy.json
一般 AWS

將 IAM 政策文件附加到 IAM 角色。

若要將 IAM 政策附加到 IAM 角色,請從 CloudShell 工作資料夾執行下列命令:

aws iam put-role-policy --role-name E2AConvLambdaRole --policy-name E2AConvLambdaPolicy --policy-document file://E2AConvLambdaPolicy.json
一般 AWS
任務描述所需技能

下載 EBCDIC 轉換源代碼。

從 CloudShell 工作資料夾中,執行下列指令以從中下載 mainframe-data-utilities 原始程式碼 GitHub:

git clone https://github.com/aws-samples/mainframe-data-utilities.git mdu
一般 AWS

建立 ZIP 封裝。

從 CloudShell 工作資料夾中,執行下列命令以建立用於 EBCDIC 轉換的 Lambda 函數的 ZIP 套件:

cd mdu; zip ../mdu.zip *.py; cd ..
一般 AWS

建立 Lambda 函數。

從 CloudShell 工作資料夾中,執行下列命令以建立用於 EBCDIC 轉換的 Lambda 函數:

aws lambda create-function \ --function-name E2A \ --runtime python3.9 \ --zip-file fileb://mdu.zip \ --handler extract_ebcdic_to_ascii.lambda_handler \ --role arn:aws:iam::$account:role/E2AConvLambdaRole \ --timeout 10 \ --environment "Variables={layout=$bucket/layout/}"

附註:環境變數配置會告知 Lambda 函數 JSON 中繼資料所在的位置。

一般 AWS

為 Lambda 函數建立以資源為基礎的政策。

從 CloudShell 工作資料夾執行下列命令,以允許 Amazon S3 事件通知觸發 Lambda 函數進行 EBCDIC 轉換:

aws lambda add-permission \ --function-name E2A \ --action lambda:InvokeFunction \ --principal s3.amazonaws.com \ --source-arn arn:aws:s3:::$bucket \ --source-account $account \ --statement-id 1
一般 AWS
任務描述所需技能

建立 Amazon S3 事件通知的組態文件。

當檔案放置在輸入資料夾中時,Amazon S3 事件通知會啟動 EBCDIC 轉換 Lambda 函數。

在工 CloudShell 作資料夾中,執行下列命令,為 Amazon S3 事件通知建立 JSON 文件:

{ "LambdaFunctionConfigurations": [ { "Id": "E2A", "LambdaFunctionArn": "arn:aws:lambda:%s:%s:function:E2A", "Events": [ "s3:ObjectCreated:Put" ], "Filter": { "Key": { "FilterRules": [ { "Name": "prefix", "Value": "input/" } ] } } } ] } EOF ) printf "$S3E2AEvent" "$region" "$account" > S3E2AEvent.json
一般 AWS

建立 Amazon S3 事件通知。

從 CloudShell 工作資料夾執行下列命令以建立 Amazon S3 事件通知:

aws s3api put-bucket-notification-configuration --bucket $bucket --notification-configuration file://S3E2AEvent.json
一般 AWS
任務描述所需技能

解析 COBOL 字帖。

從 CloudShell 工作資料夾執行下列命令,將 COBOL 範例字稿剖析為 JSON 檔案 (定義如何正確讀取和分割資料檔案):

python3 mdu/parse_copybook_to_json.py \ -copybook mdu/LegacyReference/COBKS05.cpy \ -output CLIENT.json \ -output-s3key CLIENT.ASCII.txt \ -output-s3bkt $bucket \ -output-type s3 \ -print 25
一般 AWS

新增轉換規則。

樣本數據文件及其相應的 COBOL 字帖是一個多佈局文件。這意味著轉換必須根據特定規則切片數據。在這種情況下,每行中位置 3 和 4 上的字節定義佈局。

從 CloudShell 工作資料夾中,編輯CLIENT.json檔案並將內容從變更"transf-rule": [],為以下內容:

"transf-rule": [ { "offset": 4, "size": 2, "hex": "0002", "transf": "transf1" }, { "offset": 4, "size": 2, "hex": "0000", "transf": "transf2" } ],
一般 AWS、IBM 大型主機、科博爾

將 JSON 中繼資料上傳至 S3 儲存貯體。

從 CloudShell 工作資料夾執行下列 AWS CLI 命令,將 JSON 中繼資料上傳到 S3 儲存貯體:

aws s3 cp CLIENT.json s3://$bucket/layout/CLIENT.json
一般 AWS
任務描述所需技能

將 EBCDIC 檔案傳送到 S3 儲存貯體。

從 CloudShell 工作資料夾執行下列命令,將 EBCDIC 檔案傳送至 S3 儲存貯體:

aws s3 cp mdu/sample-data/CLIENT.EBCDIC.txt s3://$bucket/input/

備註:建議您為輸入 (EBCDIC) 和輸出 (ASCII) 檔案設定不同的資料夾,以避免在 ASCII 檔案上傳至 S3 儲存貯體時再次呼叫 Lambda 轉換函數。

一般 AWS

檢查輸出。

從 CloudShell 工作資料夾中,執行下列命令以檢查是否在 S3 儲存貯體中產生 ASCII 檔案:

awss3 ls s3://$bucket/

備註:數據轉換可能需要幾秒鐘的時間才能發生。我們建議您多次檢查 ASCII 檔案。

ASCII 檔案可用之後,執行下列命令,將檔案從 S3 儲存貯體下載到目前的資料夾:

aws s3 cp s3://$bucket/CLIENT.ASCII.txt .

檢查 ASCII 文件內容:

head CLIENT.ASCII.txt
一般 AWS
任務描述所需技能

(選擇性) 準備變數和資料夾。

如果失去與的連線 CloudShell,請重新連線,然後執行以下指令,將目錄變更為工作資料夾:

cd workdir

請確定已定義環境變數:

bucket=<your_bucket_name> account=<your_account_number> region=<your_region_code>
一般 AWS

移除值區的通知設定。

從 CloudShell 工作資料夾執行下列命令以移除 Amazon S3 事件通知組態:

aws s3api put-bucket-notification-configuration \ --bucket=$bucket \ --notification-configuration="{}"
一般 AWS

刪除 Lambda 函數。

從 CloudShell 工作資料夾中,執行下列命令以刪除 EBCDIC 轉換器的 Lambda 函數:

awslambdadelete-function--function-nameE2A
一般 AWS

刪除 IAM 角色和政策。

從 CloudShell 工作資料夾中,執行下列命令以移除 EBCDIC 轉換器角色和原則:

aws iam delete-role-policy --role-name E2AConvLambdaRole --policy-name E2AConvLambdaPolicy aws iam delete-role --role-name E2AConvLambdaRole
一般 AWS

刪除 S3 儲存貯體中產生的檔案。

從 CloudShell 工作資料夾中,執行下列命令以刪除 S3 儲存貯體中產生的檔案:

aws s3 rm s3://$bucket/layout --recursive aws s3 rm s3://$bucket/input --recursive aws s3 rm s3://$bucket/CLIENT.ASCII.txt
一般 AWS

刪除工作資料夾。

從 CloudShell 工作資料夾中,執行以下指令以移除workdir及其內容:

cd ..; rm -Rf workdir
一般 AWS

相關資源