[英]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.