首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache气流2.0.0触发通过稳定REST运行的DAG,但被禁止

Apache气流2.0.0触发通过稳定REST运行的DAG,但被禁止
EN

Stack Overflow用户
提问于 2021-01-18 11:15:24
回答 1查看 1.2K关注 0票数 1

Apache气流版

2.0.0

环境

  • Cloud提供者或硬件配置:OpenStack -> VM -> Docker container
  • OS (例如来自/etc/os发行版):Debian / Linux 10 (buster)
  • Kernel (例如uname -a):Linux 77f8efd77516 4.4.0-193-泛型#224-Ubuntu

发生了什么,

我试图通过使用基于Java的客户端通过新的稳定的REST 1.0.0来触发DAG。Java是根据气流OpenAPI规范生成的,其OpenAPI生成器版本为5.0.0

我的airflow.cfg中的自定义配置

代码语言:javascript
复制
web_server_host = 0.0.0.0
web_server_port = 8080
auth_backend = airflow.api.auth.backend.default

此外,我还创建了一个管理用户:

代码语言:javascript
复制
airflow users create \
    --username admin \
    --password secret \
    --firstname john \
    --lastname doe \
    --role Admin \
    --email john.doe@example.com

在气流中,我有一个活动的DAG demo

我使用以下代码片段通过java客户机触发DAG执行:

代码语言:javascript
复制
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();
    }

但是,我收到以下例外情况:

代码语言:javascript
复制
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)

气流日志不显示任何错误信息。

你预期会发生什么,

以前,我还使用过时的试验性REST API在外部触发任务(没有客户端,但使用自定义REST调用),并且没有出现问题。

使用新的稳定API,即使通过airflow.api.auth.backend.default禁用身份验证,我的客户端似乎也没有足够的权限。

还可以通过以下方式向客户端创建添加用户名和密码:

代码语言:javascript
复制
defaultClient.setUsername("admin");
defaultClient.setPassword("secret");

结果相同的错误:FORBIDDEN

我是否需要创建一个专用的REST-API用户,如果有,是否有关于这个主题的任何文档?

如何复制它

通过OpenAPI生成器创建Java (可能任何客户机都会产生此错误):

  1. java -jar codegen/openapi-generator-cli-5.0.0.jar generate -i openapi.yaml -g java -o .
  2. create是一个简单的java类,并应用

上面的代码片段

EN

回答 1

Stack Overflow用户

发布于 2021-01-19 09:09:59

如果其他人遇到这个问题,我可以按以下方式解决:

  1. 将auth后端更改为auth_backend = airflow.api.auth.backend.basic_auth,因为airflow.api.auth.backend.default不使用新的REST-API

https://github.com/apache/airflow/issues/13739

  1. 将以下更改应用于生成客户端代码所需的气流openapi.yaml (否则用户名/密码)不会相应地传输,另请参阅:

代码语言:javascript
复制
# The API will provide support for plugins to support various authorization mechanisms.
# Detailed information will be available in the plugin specification.
security:
  - Basic: []

  1. 将java代码中的用户名/密码设置为:

代码语言:javascript
复制
// Configure HTTP basic authorization: Basic
    HttpBasicAuth Basic = (HttpBasicAuth) defaultClient.getAuthentication("Basic");
    Basic.setUsername("admin");
    Basic.setPassword("secret");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65773472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档