Terraform とイベント駆動型の Amazon CodeBuild を使用して、クラウド上のデータ アプリケーションの運用とメンテナンスの効率を向上させます。

背景情報

企業顧客が一連のデータ アプリケーションをクラウド上に展開するプロセスでは、多くの場合、データ開発チームがスクリプトの内容を担当し、その背後にある一連のクラウド リソースの管理は、通常、クラウドの運用および保守の機能チームによって実装されます。 IaC (Infrastructre as Code) を通じて。ただし、データ開発チームが対応するスクリプト コンテンツを開発してデプロイする場合、Glue や Lambda リソースの追加や変更など、クラウド上のリソースの変更が必然的に発生します。その結果、機能境界で 2 つのチーム間の緊密な結合が生じました。データ開発チームの反復コンテンツは、対応する IaC 運用および保守のためにクラウド運用および保守チームに要件を提出する必要があり、これにより、両当事者の作業負荷が増加します。

Amazon クラウド テクノロジー開発者コミュニティは、開発者にグローバルな開発テクノロジー リソースを提供します。技術ドキュメント、開発事例、技術コラム、トレーニングビデオ、アクティビティやコンテストなどがあります。中国の開発者が世界最先端のテクノロジー、アイデア、プロジェクトとつながることを支援し、優れた中国の開発者やテクノロジーを世界のクラウド コミュニティに推奨します。まだ注目/お気に入りをしていない場合は、これを見たときに慌てずにクリックして、ここを技術の宝庫にしてください。

 

最適化スキームの概要

データ アプリケーション コードの追加と変更によって双方に生じる追加のプレッシャーを軽減するために、この記事では、データ アプリケーションの追加、変更、展開のプロセスにおける主要なプロセスを最適化するケースから始めます。データ開発チームは、対応する Terraform モジュールをインターフェイスの形式で提供し、Amazon CodePipeline または EventBridge 駆動のイベント モードと連携して CI/CD パイプラインを実装します。

この場合、クラウド運用保守チームは IaC モジュールのデプロイと運用保守を担当し、IaC コードのリリースと管理に Terraform Cloud Workspace を使用します。データ開発チームは、特定の ETL タスク シナリオ用の Glue スクリプトを開発し、CodeCommit を使用してコード管理を行い、CodeBuild を使用して CI/CD コンテンツを実装し、最後に CodePipeline または EventBridge を介して CI/CD パイプラインのシリアル接続を実現する責任を負います。2 つのチームは協力して、次のシナリオを実現します。

「企業の人事部門は、ダウンストリーム データ アプリケーションのためにデータ ソースを MySQL に取り込む必要があります。データ エンジニアが Glue スクリプトの開発を完了したら、クラウド運用および保守チームが開発した Glue テンプレートを使用して、新しい Glue スクリプト (Python シェル) を作成します。 template) リソースをバッチで作成します。後続のデータ エンジニアが Glue スクリプトを作成または変更すると、この一連のパイプラインは CodeCommit で変更されたコンテンツを自動的にキャプチャし、そのコンテンツを s3 に同期できます。s3 の変更は、新規/更新リソースをトリガーする機能を直接反映します。 IaC 開発/クラウド運用チームが関与することなく、Terraform で実行できます。」

以下の最適化計画では、クラウド上でデータ アプリケーションを開発および保守する際の、クラウド運用保守チームとデータ開発チームの責任範囲を明確に定義します。

実装手順

(1) 統一されたプロセスと規範

CI/CD パイプラインの実装方法、Glue スクリプトのアップロードと保存方法、リソースに必要な構成情報 (インスタンス タイプ、必要な IAM 権限など) を含む、データ開発チームとクラウド運用保守チーム間の主要なプロセスと手順を確認します。 、ネットワーク)お待ちください。

(2) Terraformスクリプト開発

クラウド運用および保守チームは、構成パラメーター、リソースの追加/変更のためのコードを含む、Glue リソースの IaC スクリプトの開発を担当します。開発したコンテンツはglue-etlディレクトリに一律に配置されます。このディレクトリの内容の例は次のとおりです。

|____glue-etl
| |____output.tf
| |____data.tf
| |____main.tf
| |____Readme.md
| |____policy.tf
| |____variables.tf

クラウド運用保守チームは、glue-etl モジュール ( module ) をカプセル化し、Terraform Cloud の対応するワークスペースに公開します。

上記の glue-etl モジュールには次のものが含まれています。

  • tf には、このモジュールによって出力された一連のパラメーターが含まれています。
  • tf には、現在のリージョン、現在のユーザー情報、Glue スクリプトがアクセスする必要があるデータベースの Secret Manager キー文字列、Glue リソースのデプロイに必要なサブネット グループなど、Amazon 環境内のいくつかの既存のリソースへの参照が含まれています。必要な情報。
  • tf には、Glue の実行に必要な IAM ロールに対応する関連する IAM ポリシー コレクションが含まれています。
  • tf には、このモジュールを呼び出すためにユーザーが渡す必要がある一連の構成パラメーターが含まれています。

スペースの問題のため、上記の .tf の特定のコード内容は省略されています。

(3) s3 コンテンツの変更を監視する

クラウド運用およびメンテナンス チームが glue-etl モジュールの開発を完了し、それを Terraform Workspace にアップロードした後、データ開発チームは .tf ファイルを初期化し、local キーワードを使用してスクリプトをパス (例:変数bucket_name、job_path_prefix、line_of_business)を.tfファイルに追加します。

locals {
  bucket_name = "sample-bucket-glueetl"
  job_path_prefix = toset(["hr-mysql-source1-python-scripts"])
  line_of_business = "hr-department"
}

2 番目のステップは、Terraform によって提供される data.aws_s3_bucket_objects を通じて s3 上の Glue スクリプトのストレージ パスを取得することです。

data "aws_s3_bucket_objects" "glue_job_objects_for_people_mdm_staging" {
  for_each = local.job_path_prefix
  bucket   = local.bucket_name
  prefix   = "${local.line_of_business}/${each.key}"
}

次に、Glue モジュールに必要な入力パラメータを設定します。次の例は、文字列操作を通じて Glue ジョブ名をアップロードされたスクリプト名にマッピングする方法を示しています (マッピング ルールはカスタマイズできます。この例では、.py ファイルのプレフィックスが Glue ジョブ名として使用されています。図 8 を参照)。 、そして -name-map のローカル変数のジョブに入れられます。実際のアプリケーションでは、モジュールの入力パラメータとして複数のローカル変数を構成する必要がある場合があります。

locals {
  job_name_map  = { 
for job_prefix in 
[for job_name in 
[for py_name in data.aws_s3_bucket_objects.glue_job_objects_for_people_mdm_staging["hr-mysql-source1-python-scripts"].keys : split("/", py_name)[2]
] : split(".", job_name)[0]
] : job_prefix => "${job_prefix}.py" if job_prefix != "" }
}

最後に、Terraform Cloud Workspace でモジュール (この例では glue-etl) を呼び出して、特定の仕様の Glue Python シェル スクリプトをバッチで作成します。

module "glue-etl-type1" {
  source                                  = "app.terraform.io/repo/glue-etl/aws"
  subnet_list                             = ["subnet-1","subnet-2","subnet-3"]
  bucket_name                             = local.bucket_name
  line_of_business                          =  local.line_of_business
  secret_manager_id                       = "some-secretmanager-id"
  if_connection                           = true
  conn_name                               = local.connection_name_staging
  glue_job_name_list_for_python  = local.job_name_map
  max_concurrent_runs_for_python = 4
  max_retries_for_python         = 0
}

(4) CodeBuild主導のCI/CDパイプラインの実装

この記事では EventBridge を使用して CodeCommit と CodeBuild を直列に接続していますが、使用習慣に応じて Amazon CodePipeline を選択して同じ機能を実現することもできます。開始する前に、対応する Amazon CodeCommit と CodeBuild が初期化されていることを確認してください。

以下に示すように、CodeCommit ウェアハウスの追加および変更イベントによってトリガーされる EventBridge ルールを設定します。

{
  "source": [
    "aws.codecommit"
  ],
  "detail-type": [
    "CodeCommit Repository State Change"
  ],
  "detail": {
    "event": [
      "referenceCreated",
      "referenceUpdated"
    ]
  }
}

このルールの入力トランスフォーマーを構成し、次のように入力パスと入力テンプレートをそれぞれ定義します。

{"referenceType":"$.detail.referenceType","region":"$.region","repositoryName":"$.detail.repositoryName","account":"$.account","referenceName":"$.detail.referenceName"}

{"environmentVariablesOverride": [
      {
          "name": "REFERENCE_NAME",
          "value": <referenceName>
       },
      {
          "name": "REFERENCE_TYPE",
          "value": <referenceType>
       },
      {
          "name": "REPOSITORY_NAME",
          "value": <repositoryName>
       },
      {
          "name": "REPO_REGION",
          "value": <region>
       },
       {
          "name": "ACCOUNT_ID",
          "value": <account>
       }
 ]}

CI/CD パイプラインの特定のプロセスを反映するように buildspec.yml を構成します。この例では、パイプラインのコンテンツには次のものが含まれます。

  • コード内で必要な git-remote-codecommit およびその他の Python 依存関係 (この例では、Makefile を使用して依存関係をインストールします) またはコマンド (この例では Terraform など) をインストールします。
  • コード品質検査、構文検査、セキュリティ脆弱性スキャン、単体テストなど、ETL スクリプトまたは .tf ファイル コードの CI プロセスを実現します。
  • CI プロセスが終了したら、CodeCommit の更新されたコードを、Glue コンテンツが保存されている s3 パスに同期します。s3 が更新コードを受信したら、次の操作を実行します。
  • Terraform の構文チェック ( terraform fmt、validate、lint )
  • リソース変更チェック (terraform plan)
  • 最終リリース (terraform 適用)
AWS CodeBuildversion: 0.2

env:
  variables:
    TF_VERSION: "1.0.6"
    
phases:
  install:
    runtime-versions:
      python: 3.8
    commands:
      - pip install git-remote-codecommit
      - make install
  pre_build:
    commands:
      - echo Hello pre build
      - cd /usr/bin
      - "curl -s -qL -o terraform.zip https://releases.hashicorp.com/terraform/${TF_VERSION}/terraform_${TF_VERSION}_linux_amd64.zip"
      - unzip -o terraform.zip
      - cd -
  build:
    commands:
      - echo build
      - make format
      - make lint
      - make test
      - env
      - git clone -b $REFERENCE_NAME codecommit::$REPO_REGION://$REPOSITORY_NAME
      - dt=$(date '+%d-%m-%Y-%H:%M:%S');
      - echo "$dt" 
      - aws s3 sync . s3://sample-bucket-glueetl/hr-mysql-source1-python-scripts/
      - terraform init
      - terraform fmt -recursive
      - terraform validate
      - terraform apply -auto-approve
  post_build:
    commands:
      - echo post build 
      - echo "terraform fmt & validate apply completed on `date`"
      - echo "Makefile completed on `date`"

buildspec.yml ファイルを対応する CodeCommit ウェアハウスにアップロードし、新しい CodeBuild プロジェクトを作成してウェアハウスを指定し、EventBridge をイベント トリガーとして使用して CodeCommit コンテンツの変更を監視し、イベントを CodeBuild に出力して CI/CD パイプラインの完全なセットを実装します。 。スキーマは次のようになります。

画像.png

予防

  • 上記のソリューションを実装するには、さまざまな Amazon サービス間のアクセス権限と、必要な IAM ロールの実行権限が十分であるかどうかに注意する必要があります。
  • この記事で説明する方法では、構成が異なる Glue スクリプトのリソースの作成を完全に自動化することはできません。データ開発チームは、必要に応じて、対応する Terraform モジュールを再度呼び出し、上記のプロセスを繰り返す必要があります。
  • この記事で提供されるソリューションは、Amazon Code コンポーネントを使用してコードのバージョンとリリースを管理するシナリオのみを対象としています。外部コード管理コンポーネントと CI/CD ツールについては、この記事ではこれ以上説明しません。

要約する

この記事では、特定のケースを通じて、データ開発者が Terraform Cloud Workspace を通じてリモート IaC モジュール (モジュール) を呼び出し、EventBridge によって駆動される Amazon CodeCommit および Amazon CodeBuild と組み合わせて CI/CD パイプラインを開発し、データ アプリケーション スクリプトの変更を自動的にキャプチャし、対応するスクリプトを作成することを示します。クラウド リソースをバッチで管理します。データ アプリケーションに関連するリソース管理とコード変更リリース プロセスを自動化することで、クラウド運用保守チームはコード資産の追加/変更によってもたらされる管理プレッシャーを軽減します。データ アプリケーションでの追加のコード変更を気にする必要がなくなりました。一方、データ開発チームは、コード変更によるクラウド上のリソースへのその後の影響を心配することなく、コード開発と ETL スクリプトの運用および保守に集中できます。

参照文書

[1]  Amazon Code コンポーネントを使用してデータを s3 に自動バックアップする

[2]  Input Transformer を使用して EventBridge イベント情報をカスタマイズする

この記事の著者

画像.png

毛元斉

Amazon プロフェッショナル サービス チームのデータ サイエンティスト。クラウド データ プラットフォーム設計における統計学習、機械学習、データ マイニング、および関連コンサルティング サービスを担当します。サービス業には医療、金融、無人運転などが含まれ、開発・運用・保守において豊富な経験を積んでおります。

画像.png

リャン・ユー

Amazon プロフェッショナル サービス チームの DevOps コンサルタント。主に DevOps テクノロジーの実装を担当します。特にクラウド ネイティブ サービスと関連テクノロジーに熱心です。余暇には、スポーツや家族との旅行を楽しんでいます。

記事のソース: https://dev.amazoncloud.cn/column/article/6309c09ed4155422a4610a46?sc_medium=regulatorytraffic&sc_campaign=crossplatform&sc_channel=CSDN 

おすすめ

転載: blog.csdn.net/u012365585/article/details/132417869