如果 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 存储桶的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS CodeDeploy/CodePipeline/S3 将 Gitlab-Ci 部署到 EC2

cypress 录制视频在 gitlab-ci 中不起作用

Gitlab-CI 中存在已删除的标签

.gitlab-ci.yml配置参数

在此上下文中不允许 Gitlab CI YML 映射值

从资源中读取文件在 gitlab CI 中不起作用