Serverless 使用阿里雲OOS將http檔案轉存到物件儲存

AliCloudROS發表於2024-06-07

背景介紹

系統運維管理OOS

系統運維管理OOS(CloudOps Orchestration Service)提供了一個高度靈活和強大的解決方案,透過精巧地編排阿里雲提供的OpenAPI,使得使用者能夠將分散的單個原子運維任務連結起來,形成複雜的運維場景和流程。這種方式不僅大幅提升了運維的效率,也極大地減少了人為錯誤的可能性。更進一步,OOS的編排能力不僅限於基礎的雲服務管理操作,它還擴充套件到了阿里雲的其他核心服務如函式計算FC和物件儲存OSS。

檔案轉存場景

對於http檔案轉存到物件儲存的場景,經典的做法通常涉及一個繁瑣的雙步驟過程:首先,使用者需要手動下載目標檔案至本地儲存;隨後,透過使用命令列工具或編寫特定指令碼,再將檔案上傳到雲端的物件儲存服務。這個流程不僅效率較低,還需要使用者依賴於本地硬體資源或者支付額外費用租用阿里雲上的ECS例項。

然而,藉助於阿里雲OOS這一過程得到了極大簡化和最佳化。使用者無需依賴任何本地硬體或者額外的雲服務例項,僅需在阿里雲的函式計算服務上執行一段定製的Python指令碼。利用了雲端計算的彈性和函式計算的無伺服器(Serverless)特性,實現了從HTTP源直接將檔案高效轉存到物件儲存的目的。這樣不僅消除了對物理硬體或計算例項的需求,而且極大降低了操作成本,提升了資料處理的效率。此外,這一過程的自動化也意味著可以極大減少因手動操作引入的錯誤。

前提條件

  • 使用此功能必須開通函式計算服務
  • 建立執行前需要為FC建立RAM角色並授予訪問OSS的許可權

實踐步驟

  1. 登入 OOS 控制檯並使用附錄中示例模板建立自定義模板。您可以參考FC提供的Python開發指南自定義指令碼和模板。
  2. 模板建立完成後,配置引數並建立執行。執行成功後,在目標OSS Bucket中可以看到已下載的檔案。

附錄

示例模板

FormatVersion: OOS-2019-06-01
Description:
  en: FC runs script, To use this template, you must first <a href='https://help.aliyun.com/zh/functioncompute/getting-started/quickly-create-a-function#p-t79-y7o-68z' target="_blank">activate the function computing service< /a>
  zh-cn: FC執行指令碼,使用此功能必須<a href='https://help.aliyun.com/zh/functioncompute/getting-started/quickly-create-a-function#p-t79-y7o-68z' target="_blank">開通函式計算服務</a>
  name-en: FC-RunScript
  name-zh-cn: FC執行指令碼
Parameters:
  FileUrl:
    Label:
      en: FileUrl
      zh-cn: 檔案儲存URL
    Type: String
  OSSRegionId:
    Label:
      en: OSSRegionId
      zh-cn: OSS bucket所在地域ID
    Type: String
    AssociationProperty: RegionId
  OSSBucketName:
    Label:
      en: OSSBucketName
      zh-cn: OSS Bucket 名稱
    Type: String
    AssociationProperty: ALIYUN::OSS::Bucket::BucketName
    AssociationPropertyMetadata:
      RegionId: ${OSSRegionId}
    Default: ''
  OSSDirectory:
    Type: String
    Label:
      en: OSSDirectory
      zh-cn: OSS目錄
    Description:
      en: The directory where files are stored in the OSS Bucket. / is used to split the path and quickly create subdirectories. However, do not start with / and do not appear consecutive / s.
      zh-cn: 檔案儲存在 OSS Bucket 中的目錄,/ 用於分割路徑,可快速建立子目錄,但不要以 / 開頭,不要出現連續的 / 。
    Default: Download/Demo/
  FCAssumeRole:
    Label:
      en: FCAssumeRole
      zh-cn: FC扮演的RAM角色
    Description:
      en: The Function Compute platform will use this RAM role to generate a temporary key for accessing your Alibaba Cloud resources and pass it to your code. For details, please see <a href="https://help.aliyun.com/zh/functioncompute/user-guide/grant-function-compute-permissions-to-access-other-alibaba-cloud-services" target="_blank ">Grant Function Compute permissions to access other cloud services</a>
      zh-cn: 函式計算平臺會使用這個 RAM 角色(Role)來生成訪問您的阿里雲資源的臨時金鑰,並傳遞給您的程式碼。詳情請檢視<a href="https://help.aliyun.com/zh/functioncompute/user-guide/grant-function-compute-permissions-to-access-other-alibaba-cloud-services" target="_blank">授予函式計算訪問其他雲服務的許可權</a>
    Type: String
    AssociationProperty: ALIYUN::RAM::Service::Role
    AssociationPropertyMetadata:
      Service: fc.aliyuncs.com
    Default: ''
  OOSAssumeRole:
    Label:
      en: OOSAssumeRole
      zh-cn: OOS扮演的RAM角色
    Type: String
    Default: ''
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: ExecuteScript
    Action: ACS::FC::ExecuteScript
    Description:
      en: Run the python script
      zh-cn: 執行Python指令碼
    Properties:
      runtime: 'python3.10'
      role: '{{ FCAssumeRole }}'
      script: |-
        import oss2
        import requests
        
        def handler(event, context):
          # 獲取FC角色credential
          auth = oss2.StsAuth(context.credentials.access_key_id, context.credentials.access_key_secret, context.credentials.security_token)
          endpoint = 'https://oss-{{OSSRegionId}}.aliyuncs.com'
          bucket = oss2.Bucket(auth, endpoint, '{{OSSBucketName}}')
          file_url = '{{FileUrl}}'
          # 下載檔案
          file_content = requests.get(file_url)
          file_name = file_url.split('/')[-1]
          # 將檔案上傳到指定OSS
          bucket.put_object(f'{{OSSDirectory}}{file_name}', content)

示例指令碼說明:

  1. 執行環境預設 python3.10
  2. 函式名稱預設 index.handler
  3. 使用模組oss2和requests,詳情請檢視Python內建模組

相關文章