簡體   English   中英

使用 AWS CDK 創建 AWS EMR 無服務器作業

[英]Create AWS EMR Serverless job with AWS CDK

我正在使用 aws cdk 來設置我的基礎設施。 我想知道是否有任何方法可以通過帶有 AWS CDK 的 EMR 無服務器應用程序創建 ETL 作業?

我可以使用 CDK 創建無服務器應用程序,但無法找到創建作業的方法。

目前沒有使用 CDK(或 CloudFormation)創建作業的內置方法。 這部分是因為 CDK 通常用於部署基礎設施,而 Airflow 或 Step Functions 之類的東西將用於定期觸發實際作業。

理論上,您可以編寫自定義資源來觸發作業。 以下是如何使用 Python CDK 執行此操作的示例。 此代碼創建一個 EMR 無服務器應用程序、一個可用於該作業的角色(在本例中未授予訪問權限)以及一個啟動該作業的自定義資源。 請注意,與自定義資源關聯的策略需要向 EMR 無服務器作業執行角色授予iam:PassRole訪問權限。

from aws_cdk import Stack
from aws_cdk import aws_emrserverless as emrs
from aws_cdk import aws_iam as iam  # Duration,
from aws_cdk import custom_resources as custom
from constructs import Construct


class EmrServerlessJobRunStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # Create a serverless Spark app
        serverless_app = emrs.CfnApplication(
            self,
            "spark_app",
            release_label="emr-6.9.0",
            type="SPARK",
            name="cdk-spark",
        )

        # We need an execution role to run the job, this one has no access to anything
        # But will be granted PassRole access by the Lambda that's starting the job.
        role = iam.Role(
            scope=self,
            id="spark_job_execution_role",
            assumed_by=iam.ServicePrincipal("emr-serverless.amazonaws.com"),
        )

        # Create a custom resource that starts a job run
        myjobrun = custom.AwsCustomResource(
            self,
            "serverless-job-run",
            on_create={
                "service": "EMRServerless",
                "action": "startJobRun",
                "parameters": {
                    "applicationId": serverless_app.attr_application_id,
                    "executionRoleArn": role.role_arn,
                    "name": "cdkJob",
                    "jobDriver": {"sparkSubmit": {"entryPoint": "local:///usr/lib/spark/examples/src/main/python/pi.py"}},
                },
                "physical_resource_id": custom.PhysicalResourceId.from_response(
                    "jobRunId"
                ),
            },
            policy=custom.AwsCustomResourcePolicy.from_sdk_calls(
                resources=custom.AwsCustomResourcePolicy.ANY_RESOURCE
            ),
        )

        # Ensure the Lambda can call startJobRun with the earlier-created role
        myjobrun.grant_principal.add_to_policy(
            iam.PolicyStatement(
                effect=iam.Effect.ALLOW,
                resources=[role.role_arn],
                actions=["iam:PassRole"],
                conditions={
                    "StringLike": {
                        "iam:PassedToService": "emr-serverless.amazonaws.com"
                    }
                },
            )
        )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM