在 DAG 中使用 boto3 时,Apache Airflow 无法找到 AWS 凭证

2024-01-18

我们正在使用 ECS Fargate 迁移到 Apache Airflow。

我们面临的问题,很简单。我们有一个简单的 DAG,其任务之一是与 AWS 中的某些外部服务进行通信(比方说,从 S3 下载文件)。这是 DAG 的脚本:

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator

from datetime import datetime, timedelta


# default arguments for each task
default_args = {
    'owner': 'thomas',
    'depends_on_past': False,
    'start_date': datetime(2015, 6, 1),
    'retries': 1,
    'retry_delay': timedelta(minutes=1),
}


dag = DAG('test_s3_download',
          default_args=default_args,
          schedule_interval=None) 

TEST_BUCKET = 'bucket-dev'
TEST_KEY = 'BlueMetric/dms.json'


# simple download task
def download_file(bucket, key):
    import boto3
    s3 = boto3.resource('s3')
    print(s3.Object(bucket, key).get()['Body'].read())


download_from_s3 = PythonOperator(
    task_id='download_from_s3',
    python_callable=download_file,
    op_kwargs={'bucket': TEST_BUCKET, 'key': TEST_KEY},
    dag=dag)


sleep_task = BashOperator(
    task_id='sleep_for_1',
    bash_command='sleep 1',
    dag=dag)


download_from_s3.set_downstream(sleep_task)

正如我们在其他时候使用 docker 时所做的那样,我们在 docker 容器中创建,~/.aws the config文件内容如下:

[default]
region = eu-west-1

只要容器位于 AWS 边界内,它就会解析每个请求,而无需指定凭据。

这是Dockerfile我们正在使用:

FROM puckel/docker-airflow:1.10.7

USER root

COPY entrypoint.sh /entrypoint.sh
COPY requirements.txt /requirements.txt

RUN apt-get update

RUN ["chmod", "+x", "/entrypoint.sh"]

RUN mkdir -p /home/airflow/.aws \
&& touch /home/airflow/.aws/config \
&& echo '[default]' > /home/airflow/.aws/config \
&& echo 'region = eu-west-1' >> /home/airflow/.aws/config

RUN ["chown", "-R", "airflow", "/home/airflow"]

USER airflow

ENTRYPOINT ["/entrypoint.sh"]

# # Expose webUI and flower respectively
EXPOSE 8080
EXPOSE 5555

一切都像魅力一样。目录和所有者更改已成功完成,但在运行 DAG 时,失败并显示:

...
...
File "/usr/local/airflow/.local/lib/python3.7/site-packages/botocore/signers.py", line 160, in sign
    auth.add_auth(request)
  File "/usr/local/airflow/.local/lib/python3.7/site-packages/botocore/auth.py", line 357, in add_auth
    raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Unable to locate credentials
[2020-08-24 11:15:02,125] {{taskinstance.py:1117}} INFO - All retries failed; marking task as FAILED

所以我们认为Airflow的工作节点确实使用了另一个用户。

你们有人知道发生了什么事吗?感谢您提供的任何建议/启发。


创建一个合适的task_role_arn用于任务定义。该角色由容器内触发的进程承担。另一个注释是错误不应显示为:

Unable to locate credentials

这会误导人,但是

Access Denied: you don't have permission to s3:GetObject.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 DAG 中使用 boto3 时,Apache Airflow 无法找到 AWS 凭证 的相关文章

随机推荐

  • 如何在 jQuery 中修改序列化表单数据?

    我正在尝试在 AJAX 中提交表单 因此我必须序列化 数据 但我正在使用fckEditor并且 jQuery 不知道如何处理它 所以在序列化之后 我尝试手动修改该值 但到目前为止没有运气 任何想法 if content val var va
  • 杀死Linux中的进程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 server01 ps ax grep java Warning bad ps syntax perhaps a bogus See ht
  • 密码错误 3 次:git 不再要求输入密码

    我想推送远程 git 存储库 我输入了错误的密码三次 我创建了一个新的 ssh 密钥并在存储库服务器上注册了新的公钥 但 ssh 代理不会提示输入密码 它只是不断地告诉我 权限被拒绝 公钥 致命 无法从远程读取 存储库 请确保您拥有正确的访
  • DDD 中两个限界上下文之间的通信

    我有几个不同的有界上下文在域中 CRUD 操作的验证是在每个限界上下文中构建的 例如 我可以仅当创建者是组长时才创建名为 GAME 的实体 在这个例子中我有两个有界上下文 BC 其一是Game BC另一个是User BC 为了解决这个问题
  • javax.el.E​​LException:无法将类型类 java.util.ArrayList 的 [light、amber、brown、dark] 转换为类 [Ljava.lang.String;

    我正在练习 Head First Servlets and JSP 书中的示例 我正在尝试创建一个简单的标签 其作用类似于html select标签 我根据书中给出的示例创建了 tld 标记处理程序和其余 servlet 以及 JSP 如需
  • 将 PartCover.NET 与 NAnt 集成

    我正在尝试将 PartCover NET 与 NAnt 和 CruiseControl NET 集成 我可以毫无问题地运行 PartCover NET 浏览器 但一旦我尝试在 NAnt 任务 在我的 CCNET 版本中 中运行它 它就无法工
  • 将子类转换为超类后调用方法的有趣行为

    class A int i 1 int f return i class B extends A int i 2 int Override f return i public class override test public stati
  • 在MySQL中存储图像[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 请给我在 MySQL 数据库中插入图像的查询 我是 stackoverflow 的新手 所以如果我的问题不符合标准 请忽略我 如果映像位于您
  • 人工智能中与最佳优先搜索相关的问题有哪些?

    我知道一般问题包括局部最大值和高原 但是我很好奇是否还有与此特定搜索相关的更多问题 以及为了克服这些问题我的最佳行动方案是什么 有人还可以给我一个例子 说明该搜索适合用于哪种类型的问题吗 最佳优先搜索的问题 它很贪婪 在许多情况下 它会带来
  • MySQL 中 utf8mb4 和 utf8 字符集有什么区别?

    有什么区别utf8mb4 and utf8字符集在MySQL 我已经知道了ASCII UTF 8 UTF 16 and UTF 32编码 但我很想知道有什么区别utf8mb4具有其他编码类型定义的编码组MySQL服务器 使用有什么特别的好处
  • TypeScript 使用实例访问静态变量

    所以在大多数OOP语言中静态变量也可以被称为class变量 即它们的值为shared在该类的所有实例中 例如 在我的游戏中我有一堂课Bullet其扩展为GreenBullet and PinkBullet 我希望这些子类有一个名为 类 或
  • 带有 date_trunk 函数和时区的 Django ORM

    我想用日期截断SQL 函数 但它似乎不适用于时区 使用 Django 进行测试 1 from django db import connection cursor connection cursor cursor execute SELEC
  • SVN 1.3 VS 1.5(最新)

    我们的IT人员已经安装了SVN 1 3 当前版本是1 5 我们正在从 CVS 迁移到 SVN 那么继续使用 1 3 会损失很多吗 我喜欢运行 CVS2SVN 并转移到 SVN 而不需要编写任何脚本 另外 在 CVS 中 我们的项目中有多个目
  • 如果视口为 480 像素或更小,请更改为 FullCalendar 中的 basicDay 视图?

    有没有一种简单的方法可以根据 FullCalendar 中的当前视口大小更改用户的视图 我想做的是在桌面上显示月视图 如果使用 iPhone 或移动设备则显示日视图 目前 使用月视图时 所有事件都被压缩在移动设备上 当前代码 documen
  • scandir - 对数字文件名进行排序

    做了一些搜索 但似乎找不到我正在寻找的确切答案 我想使用 scandir dir 提取带有编号文件名的文件 但让它们正确排序 例如 文件名是 1 something ext 2 something else ext 3 a third na
  • 如何设置等于Android上另一个小部件的宽度

    我需要在文本字段下方绘制一条水平线 使线的宽度等于文本宽度 而不是全屏的宽度 在我的应用程序中 我在视图 水平线 下方有一个文本视图 这线视图的宽度应等于文本视图的宽度 我尝试了 android layout width wrap cont
  • 匹配有效命名空间名称的正则表达式

    我以为这个问题以前有人问过 但我尝试谷歌但没有找到答案 也许我使用了错误的关键字 是否可以使用正则表达式来匹配有效的 C 命名空间名称 Update 感谢大家的回答和研究 这个问题比我想象的要复杂得多 作为奥斯卡 梅德罗斯 https st
  • 从 IIS 上的命令行列出所有托管网站

    我们如何通过 IIS 命令行列出所有托管网站 您可能必须以管理员身份运行它 appcmd list site 直接来自http technet microsoft com en us library cc771280 v ws 10 asp
  • 将一种类型的同构 HList 映射到不同类型的异构 List

    我有一个字符串 HList val strings The Lorax Dr Suess HNil 在另一个特殊类型列表中 case class Title title String words List String case class
  • 在 DAG 中使用 boto3 时,Apache Airflow 无法找到 AWS 凭证

    我们正在使用 ECS Fargate 迁移到 Apache Airflow 我们面临的问题 很简单 我们有一个简单的 DAG 其任务之一是与 AWS 中的某些外部服务进行通信 比方说 从 S3 下载文件 这是 DAG 的脚本 from ai