Docker环境下Kafka Connect无法识别AWS环境变量凭证问题
问题
自学Kafka Connect,在Docker环境搭建数据管道时遇到凭证读取问题:
通过Connect REST API创建S3 Sink连接器时无即时错误,但查询连接器状态时收到错误:
"org.apache.kafka.connect.errors.ConnectException: com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain:
并列出AWS查找凭证的所有位置。
使用的curl命令及连接器配置如下:
curl -s -X POST -H "Content-Type: application/json" --data '{ "name": "S3Connector", "config": { "connector.class": "io.confluent.connect.s3.S3SinkConnector", "flush.size": "1", "name": "S3Connector", "topics": "inputTopic", "key.converter": "org.apache.kafka.connect.storage.StringConverter", "value.converter": "org.apache.kafka.connect.storage.StringConverter", "s3.bucket.name": "bucket-name-here", "s3.region": "us-east-2", "storage.class": "io.confluent.connect.s3.storage.S3Storage", "s3.credentials.provider.secret_access_key": "secret-access-key-here", "s3.credentials.provider.access_key_id": "access-key-id-here", "format.class": "io.confluent.connect.s3.format.bytearray.ByteArrayFormat" } }' http://localhost:8083/connectors
尝试过的操作:
- 最初用
s3.credentials配置项传入凭证,报错; - 手动用
export设置环境变量,删除连接器后重建,问题依旧; - 最终在docker-compose中设置环境变量后解决。
疑问:是否Confluent Hub安装的S3连接器(命令confluent-hub install --no-prompt confluentinc/kafka-connect-s3:latest)仅在安装时读取环境变量,后续无法获取新环境变量?
分析与解决
1. 连接器配置项错误
你使用的s3.credentials.provider.secret_access_key和s3.credentials.provider.access_key_id是错误的配置项。Confluent S3 Sink连接器的凭证配置应该用:
aws.access.key.id:AWS访问密钥IDaws.secret.access.key:AWS秘密访问密钥
错误的配置项导致连接器无法识别传入的凭证,只能走默认的AWS凭证链查找流程,最终触发找不到凭证的错误。
2. export环境变量无效的原因
在Docker环境中,宿主机用export设置的环境变量,不会自动传递给已经运行的Kafka Connect容器。容器启动时会加载自身独立的环境变量空间,宿主机的环境变量无法同步到运行中的容器内部,所以这种操作不会生效。
3. docker-compose设置环境变量生效的原因
通过docker-compose设置环境变量,是在容器启动阶段直接将变量注入到容器内部的环境中,Kafka Connect进程启动时就能读取到这些变量,连接器通过AWS SDK的默认凭证链(优先读取环境变量)就能获取到有效凭证。
关于连接器读取环境变量的时机
连接器并非仅在安装时读取环境变量,而是在连接器实例启动时通过AWS SDK的凭证链机制读取。之前用export没生效,核心原因是环境变量没进入容器内部,而非连接器不读取新变量。只要容器内部的环境变量更新后重启Kafka Connect服务,连接器就能获取到新的凭证信息。
内容的提问来源于stack exchange,提问作者user3491700

