Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在DAG中使用boto3时,Apache无法找到AWS凭据_Amazon Web Services_Docker_Airflow - Fatal编程技术网

Amazon web services 在DAG中使用boto3时,Apache无法找到AWS凭据

Amazon web services 在DAG中使用boto3时,Apache无法找到AWS凭据,amazon-web-services,docker,airflow,Amazon Web Services,Docker,Airflow,我们正在使用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 fro

我们正在使用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
中创建
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的worker节点确实使用了另一个用户


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

为任务定义创建适当的
任务\u角色\arn
。此角色由容器内触发的进程承担。另一个注释是错误不应为:

找不到凭据

这误导了我们,但是


访问被拒绝:您没有s3:GetObject的权限

以什么用户身份运行?确保用户有权访问凭据。在docker容器(气流正在运行的地方)内运行boto3命令,使其成为该用户。另一个更好的选择是与S3操作员使用气流连接方法。看看这个,看看是否可以指定自定义.aws/config路径。可能是在尝试默认位置。我现在也有同样的问题。您是如何发现所引发的错误被错误地描述的?我搜索了信息,发现有另一个角色(task\u role\u arn)我根本没有定义。我添加了它,它在根本不需要更改Docker映像的情况下工作(我非常确定Docker映像是正确的,并且凭证的定义符合预期,我已经做了很多次)。