Amazon web services 在DAG中使用boto3时,Apache无法找到AWS凭据
我们正在使用ECS Fargate迁移到Apache Airflow 我们面临的问题很简单。我们有一个简单的DAG,它的任务之一是与AWS中的一些外部服务通信(比如,从S3下载一个文件)。这是DAG的脚本: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
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映像是正确的,并且凭证的定义符合预期,我已经做了很多次)。