如果 Gitlab CI 中不存在,则创建 S3 存储桶
Posted
技术标签:
【中文标题】如果 Gitlab CI 中不存在,则创建 S3 存储桶【英文标题】:Creating S3 Bucket if not exist in Gitlab CI 【发布时间】:2022-01-10 22:28:22 【问题描述】:我从环境变量中获取 S3 存储桶的名称。如果它还不存在,我想创建它。我写了这份工作:
check_s3_bucket:
stage: create environment
image:
name: banst/awscli
entrypoint: ['']
script:
- |-
if aws s3api head-bucket --bucket "$BUCKET_NAME" 2>&1 | grep -q 'Not Found'; then
echo "Creating S3 Bucket: $BUCKET_NAME in Region: $AWS_DEFAULT_REGION";
aws s3api create-bucket --bucket $BUCKET_NAME --region $AWS_DEFAULT_REGION \
--create-bucket-configuration LocationConstraint=$AWS_DEFAULT_REGION --acl public-read;
else
echo "Bucket already exists."
fi
不幸的是,它总是遇到 else 语句。我尝试通过管道将 stderr 传输到 stdout,但仍然无法正常工作。
【问题讨论】:
脚本看起来不错。也许存在权限问题并返回“禁止”? 我注意到您几乎所有的问题都得到了回答,但没有一个答案被接受。接受有用的答案不仅是一种好习惯,而且可以减少重复并增加您的问题得到实际回答的机会。 进展如何?还是不行? 不幸的是,它仍然不起作用。我尝试了你的新代码,但它仍然总是遇到“桶已经存在”。声明。 我的代码是正确的。你可能以某种方式改变了它? 【参考方案1】:grep
工作正常,所以你总是去别的地方。最好通过以下方式做到这一点:
if grep "Not Found" <(aws s3api head-bucket --bucket "$BUCKET_NAME" 2>&1); then
echo "Creating S3 Bucket: $BUCKET_NAME in Region: $AWS_DEFAULT_REGION";
aws s3api create-bucket --bucket $BUCKET_NAME --region $AWS_DEFAULT_REGION \
--create-bucket-configuration LocationConstraint=$AWS_DEFAULT_REGION --acl public-read;
else
echo "Bucket already exists."
fi
【讨论】:
感谢您的帮助。是的,我试过了,它可以工作,但我的问题是 aws cli 可能会引发不同类型的错误。例如。如果存储桶已经存在但我不拥有它。在这种情况下,我不想创建存储桶,因为它也会失败。我需要过滤 stderr 输出,并且只有在错误输出包含“未找到”文本时才运行 create-bucket 命令。 @JociIvanics 没问题。如果它有效,那么接受答案将不胜感激。对于新的错误和问题,提出一个新的问题会更好。 当然,如果问题将被回答但尚未回答,我会接受。我只想在存储桶不存在的情况下创建它。由于 aws cli 可以返回多个错误代码,因此如果错误包含“未找到”文本,我必须检查错误响应并仅创建存储桶。这就是为什么我需要grep。我已经在没有 grep 的情况下完成了这项工作,并且效果很好,但问题是 aws cli 可以返回许多不同类型的错误。以上是关于如果 Gitlab CI 中不存在,则创建 S3 存储桶的主要内容,如果未能解决你的问题,请参考以下文章