Docker部署Loki无法存储数据至AWS S3,求配置排查
问题背景
Docker部署的Loki服务运行正常,但日志数据仅存储在本地文件系统,指定的AWS S3存储桶始终为空。已配置带编程访问权限的IAM用户,且验证该用户可正常向存储桶上传文件,相关配置如下:
IAM策略配置
{"Version": "2012-10-17","Statement": [{"Sid": "LokiStorage","Effect": "Allow","Action": ["s3:ListBucket","s3:PutObject","s3:GetObject","s3:DeleteObject"],"Resource": ["arn:aws:s3:::__myBucket__","arn:aws:s3:::__myBucket__/*"]}]}
Docker Compose配置
version: "3.8" volumes: loki_data: {} services: loki: image: grafana/loki:2.1.0 networks: - my-overlay ports: - 3100:3100 volumes: - ./loki/loki-config.yml:/etc/loki/local-config.yml - loki_data:/loki command: -config.file=/etc/loki/local-config.yaml
Loki配置文件(loki-config.yaml)
--- auth_enabled: false ingester: chunk_idle_period: 3m chunk_block_size: 262144 chunk_retain_period: 1m max_transfer_retries: 0 lifecycler: ring: kvstore: store: inmemory replication_factor: 1 limits_config: enforce_metric_name: false reject_old_samples: true reject_old_samples_max_age: 168h compactor: working_directory: /loki/boltdb-shipper-compactor shared_store: aws schema_config: configs: - from: 2020-07-01 store: boltdb-shipper object_store: aws schema: v11 index: prefix: loki_index_ period: 24h server: http_listen_port: 3100 storage_config: aws: s3: s3://__myAccessKey__:__mySecretAccessKey__@eu-west-1/__myBucket__ boltdb_shipper: active_index_directory: /loki/index shared_store: s3 cache_location: /loki/boltdb-cache chunk_store_config: max_look_back_period: 0s table_manager: retention_deletes_enabled: false retention_period: 0s
排查建议
1. 修复配置文件路径的拼写错误
Docker Compose中挂载的配置文件是/etc/loki/local-config.yml(.yml后缀),但启动命令指定的是-config.file=/etc/loki/local-config.yaml(.yaml后缀),两者后缀不一致会导致Loki无法加载自定义配置,转而使用默认配置将数据存储在本地。请统一后缀,比如修改启动命令为:
command: -config.file=/etc/loki/local-config.yml
2. 优化S3配置格式,避免编码问题
当前S3配置将密钥直接放在URL中,如果密钥包含特殊字符(如/、+、=)会导致解析失败。建议拆分配置项:
storage_config: aws: access_key_id: "__myAccessKey__" secret_access_key: "__mySecretAccessKey__" region: eu-west-1 bucket: "__myBucket__"
这种方式无需URL编码,配置更清晰。
3. 查看Loki容器日志定位错误
执行以下命令查看容器日志,重点查找与S3相关的错误信息(如权限校验失败、连接超时、存储桶不存在等):
docker logs <your-loki-container-name>
4. 统一配置中的存储标识
配置中compactor.shared_store为aws,但boltdb_shipper.shared_store为s3,建议统一为aws保持一致性:
boltdb_shipper: active_index_directory: /loki/index shared_store: aws cache_location: /loki/boltdb-cache
5. 验证容器内的S3连通性
进入Loki容器,手动测试S3上传,排查网络或凭证问题:
# 进入容器 docker exec -it <your-loki-container-name> sh # 安装AWS CLI(Alpine镜像用apk,Debian/Ubuntu用apt) apk add aws-cli # 配置临时凭证 export AWS_ACCESS_KEY_ID=__myAccessKey__ export AWS_SECRET_ACCESS_KEY=__mySecretAccessKey__ export AWS_DEFAULT_REGION=eu-west-1 # 测试上传 echo "test" > test.txt aws s3 cp test.txt s3://__myBucket__/test.txt
如果测试失败,说明容器内网络或凭证存在问题;如果成功,则问题出在Loki的配置逻辑上。
6. 检查Loki版本兼容性
当前使用的Loki 2.1.0版本较旧,boltdb-shipper对S3的支持存在一些已知问题,建议升级到2.4.x及以上的稳定版本,再测试存储功能。
7. 确认S3存储桶区域匹配
验证S3存储桶的实际区域是否为eu-west-1,区域不匹配会导致连接失败,可在AWS控制台查看存储桶的区域信息。
内容的提问来源于stack exchange,提问作者ilricca

