我使用部署到关键云代工厂的spring cloud数据流,将Spring批处理作业作为Spring云任务运行,并且作业需要aws凭据才能访问s3存储桶。
我尝试将aws凭据作为任务属性传递,但凭据作为参数或属性显示在任务的日志文件中。 (https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#spring-cloud-dataflow-global-properties)
目前,我在每次部署后手动将凭据设置为pcf中的env变量,但我尝试自动执行此操作。在实际启动任务之前,不会部署任务,因此在部署时我必须启动任务,然后等待由于缺少凭据而导致失败,然后使用cf
设置env变量凭据CLI。我如何提供这些凭据,而不在pcf应用程序的日志中显示它们?
我还探讨了使用保险库和弹簧云配置,但同样,我需要将凭据传递给任务以访问spring cloud配置。
谢谢!
答案 0 :(得分:1)
这是一个任务/批处理作业example。
此应用使用spring-cloud-starter-aws
。此启动器已经提供了Boot自动配置,并且能够将AWS信誉覆盖为Boot属性。
从SCDF启动时会覆盖属性,如:
任务启动--name S3LoaderJob --arguments“--cloud.aws.credentials.accessKey = --cloud.aws.credentials.secretKey = --cloud.aws.region.static = --cloud.aws.region 。汽车=假“
您可以决定控制任务的日志级别,因此不会以纯文本格式记录它们。
答案 1 :(得分:1)
任务的安全凭证应该通过任务定义中的环境变量进行配置,或者使用Spring Cloud Config Server之类的东西来配置(并在休息时加密存储它们)。 Spring Cloud Task以明文形式存储数据库中的所有命令行参数,这就是不应该以这种方式传递的原因。
答案 2 :(得分:0)
在考虑所提供答案中包含的方法后,我继续进行测试和研究,并得出结论,最佳方法是使用Cloud Foundry“用户提供的服务”为任务提供AWS凭据。
https://docs.cloudfoundry.org/devguide/services/user-provided.html
Spring Boot自动处理每个应用程序容器中包含的VCAP_SERVICES环境变量。
http://engineering.pivotal.io/post/spring-boot-injecting-credentials/
然后我在application-cloud.properties中使用了属性占位符来将处理后的属性映射到spring-cloud-aws属性中:
cloud.aws.credentials.accessKey=${vcap.services.aws-s3.credentials.aws_access_key_id}
cloud.aws.credentials.secretKey=${vcap.services.aws-s3.credentials.aws_secret_access_key}