[英]Apache Airflow 2.0.0 Trigger a DAG Run via the Stable REST API fails with FORBIDDEN
Apache Airflow 版本:
2.0.0
环境:
uname -a
):Linux 77f8efd77516 4.4.0-193-generic #224-Ubuntu发生了什么:
我正在尝试使用基于 Java 的客户端通过新的稳定 REST-API 1.0.0
触发 DAG 运行。 Java 客户端是从 Airflow OpenAPI 规范和 OpenAPI 生成器版本5.0.0
生成的。
我的airflow.cfg
中的自定义配置:
web_server_host = 0.0.0.0
web_server_port = 8080
auth_backend = airflow.api.auth.backend.default
此外,我还创建了一个管理员用户:
airflow users create \
--username admin \
--password secret \
--firstname john \
--lastname doe \
--role Admin \
--email john.doe@example.com
在 Airflow 我有一个活跃的 DAG demo
我使用以下代码片段通过 java 客户端触发 DAG 执行:
ApiClient defaultClient = Configuration.getDefaultApiClient();
defaultClient.setBasePath("http://1.2.3.4:8080/api/v1);
DagRunApi dagRunApi = new DagRunApi(defaultClient);
DAGRun dagRun = new DAGRun();
try {
DAGRun result = dagRunApi.postDagRun("demo", dagRun);
LOGGER.debug(result);
} catch (ApiException e) {
e.printStackTrace();
}
但是,我收到以下异常:
org.openapitools.client.ApiException: FORBIDDEN
at org.openapitools.client.ApiClient.handleResponse(ApiClient.java:1012)
at org.openapitools.client.ApiClient.execute(ApiClient.java:925)
at org.openapitools.client.api.DagRunApi.postDagRunWithHttpInfo(DagRunApi.java:740)
at org.openapitools.client.api.DagRunApi.postDagRun(DagRunApi.java:715)
at de.baas.evaluation.scheduler.airflow.ExternalTrigger.triggerDAGRun(ExternalTrigger.java:46)
at de.baas.evaluation.scheduler.service.BaaSScheduler$1.message(BaaSScheduler.java:60)
at de.baas.evaluation.scheduler.service.BaaSScheduler$1.message(BaaSScheduler.java:53)
at io.lettuce.core.pubsub.PubSubEndpoint.notifyListeners(PubSubEndpoint.java:217)
at io.lettuce.core.pubsub.PubSubEndpoint.notifyMessage(PubSubEndpoint.java:206)
at io.lettuce.core.pubsub.PubSubCommandHandler.doNotifyMessage(PubSubCommandHandler.java:292)
at io.lettuce.core.pubsub.PubSubCommandHandler.notifyPushListeners(PubSubCommandHandler.java:223)
at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:606)
at io.lettuce.core.pubsub.PubSubCommandHandler.decode(PubSubCommandHandler.java:112)
at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:560)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Airflow 日志不显示任何错误消息。
您期望发生的事情:
以前,我还使用过时的实验性 REST-API 从外部触发任务(没有客户端,但使用自定义 REST 调用)并且它可以正常工作。
使用新的稳定 API 似乎我的客户端没有足够的权限,即使通过airflow.api.auth.backend.default
停用身份验证也是如此
而且还通过添加用户名和密码到客户端创建
defaultClient.setUsername("admin");
defaultClient.setPassword("secret");
导致相同的错误: FORBIDDEN
我是否需要创建一个专门的 REST-API 用户,如果是,是否有关于此主题的任何文档?
如何重现它:
通过 OpenAPI 生成器创建 Java 客户端(可能任何客户端都会产生此错误):
java -jar codegen/openapi-generator-cli-5.0.0.jar generate -i openapi.yaml -g java -o.
万一其他人遇到这个问题,我可以按如下方式解决它:
change the auth backend to auth_backend = airflow.api.auth.backend.basic_auth
because airflow.api.auth.backend.default
does not work with the new REST-API
apply the following change to the Airflow openapi.yaml
which is required to generate the client code corretly (otherwise username/password) are not transmitted corretly, see also: https://github.com/apache/airflow/issues/13739
# The API will provide support for plugins to support various authorization mechanisms.
# Detailed information will be available in the plugin specification.
security:
- Basic: []
// Configure HTTP basic authorization: Basic
HttpBasicAuth Basic = (HttpBasicAuth) defaultClient.getAuthentication("Basic");
Basic.setUsername("admin");
Basic.setPassword("secret");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.