如何跨AWS账号将S3 Bucket文件列表设为Jenkins Choice Parameter
在Jenkins声明式管道中配置跨账号S3文件列表作为Choice Parameter
核心方案
声明式管道的默认参数是静态的,要实现动态加载跨账号S3文件列表,需借助Active Choices插件(功能更灵活)结合AWS跨账号角色凭证来实现,以下是具体步骤:
1. 必备插件安装
- 安装
Active Choices Plug-in - 安装
AWS Credentials Plugin和AWS SDK Plugin,用于处理AWS身份验证和跨角色访问
2. 配置跨账号角色凭证
在Jenkins凭证管理中添加类型为AWS Role ARN的凭证,填入目标AWS账号的跨角色ARN(格式:arn:aws:iam::目标账号ID:role/跨账号角色名),同时确保当前Jenkins所在环境(如EC2实例的IAM角色)拥有sts:AssumeRole权限来扮演这个跨账号角色。
3. 声明式管道代码实现
直接在管道中编写动态参数逻辑,通过STS获取跨角色凭证后调用S3 API获取文件列表:
pipeline { agent any parameters { activeChoiceParam(name: 'TARGET_S3_FILE', description: '选择目标S3桶中的文件', filterable: true, choiceType: 'SINGLE_SELECT', script: { // 导入AWS SDK类 import com.amazonaws.services.s3.AmazonS3ClientBuilder import com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider // 配置跨账号角色信息 def crossAccountRoleArn = 'arn:aws:iam::123456789012:role/jenkins-cross-account-s3-role' def sessionName = 'jenkins-s3-fetch-session' // 获取跨角色凭证 def credentialsProvider = new STSAssumeRoleSessionCredentialsProvider.Builder( crossAccountRoleArn, sessionName ).build() // 初始化S3客户端 def s3Client = AmazonS3ClientBuilder.standard() .withCredentials(credentialsProvider) .withRegion('us-east-1') // 替换为你的S3桶区域 .build() // 指定目标桶名,获取文件列表(排除文件夹) def targetBucket = 'my-target-cross-account-bucket' def objectSummaries = s3Client.listObjects(targetBucket).getObjectSummaries() def fileOptions = objectSummaries.findAll { !it.getKey().endsWith('/') }.collect { it.getKey() } return fileOptions } ) } stages { stage('验证选择') { steps { echo "选中的S3文件路径: ${params.TARGET_S3_FILE}" } } } }
4. 权限与调试要点
- 目标账号的跨角色必须配置
s3:ListBucket权限,允许访问指定的S3桶 - 如果需要过滤特定前缀的文件,改用
listObjectsV2并传入prefix参数,例如:def objectSummaries = s3Client.listObjectsV2(targetBucket, 'release-packages/').getObjectSummaries() - 若遇到权限报错,可在脚本中添加
echo语句打印凭证获取状态或S3请求详情,方便排查
内容的提问来源于stack exchange,提问作者Kratika Tripathi
相关产品推荐
相关产品推荐

