【问题标题】:How to write a bash script to download multiple S3 glacier archives?如何编写 bash 脚本来下载多个 S3 冰川档案?
【发布时间】:2020-09-21 05:16:30
【问题描述】:

我正在使用以下 bash 脚本从 AWS S3 glacier 下载多个档案。

#!/usr/bin/env bash

export account_id=my_account_id
export vault_name=my_value
export archive_ids=("fA5tzbZeENQXl-hflqGmj8baB9q5ORwKAZlglAJeKDfNoomKJWLmA7SxpNPvgDxbS46Cp6Q8ByJiB7Vp8EipJ5shiSVMoj8Y5AZjxJEYhSsoQzHoqRQ48U2jiiDuBQ6ZW9Pazpp6PQ" "sLTV5km56fyT5k4TZIa9hQ9Q0m5YsmIQv8N1Vl4la5FTlsywobCARmvFKvI-KTJkyrGcm82LpRe62U9Z8xn6TEzdBAXYlgDSNI75biDMicBM76gyJ2dcpBRnDdulgK2ZhaZWgx0cbB")

for i in ${archive_ids[@]}; do
  aws glacier initiate-job --vault-name ${VAULT_NAME} --account-id ${account_id} --job-parameters "{\"Type\": \"archive-retrieval\", \"ArchiveId\": \"$i\", \"Tier\": \"Expedited\"}"
done

上述脚本的一个问题是它需要我在第一个for 循环之后按q 才能继续执行。

脚本在第一次循环后保持显示locationjobId 的状态。我必须记住jobIdq 让它离开这个状态。

{
    "location": "/<account_id>/vaults/<vault_name>/jobs/1JbD7xVEBcOWQC1qnmxmNNnEpfy8E3-1fLaR6XoUnU5DK7TARLsS4-9jalykFeqK6_3A2VpvoscMz_xsTtAZYj_M_XSu",
    "jobId": "1JbD7xVEBcOWQC1qnmxmNNnEpfy8E3-1fLaR6XoUnU5DK7TARLsS4-9jalykFeqK6_3A2VpvoscMz_xsTtAZYj_M_XSu"
}

如何将jobId 输出到文件中,使其不处于停止状态,以便我可以使用脚本下载多个存档?

【问题讨论】:

    标签: bash amazon-web-services aws-cli amazon-glacier


    【解决方案1】:

    我怀疑您使用的是 AWS CLI v2,问题是由客户端寻呼机引起的。

    您可以在 ~.aws/config 文件中使用此配置选项停用寻呼机:

    [default]
    cli_pager=
    

    见:Using AWS CLI pagination options - AWS Command Line Interface

    【讨论】:

      【解决方案2】:

      我编写了一个脚本来启动检索多个档案的工作,然后将所有工作 ID 存储到一个文件中。

      #!/usr/bin/env bash
      
      # the file to store all the "archive-retrieval" jobs' ids 
      export job_ids_file=job_ids.log
      export vault_name=my-vault
      export archive_ids=("fA5tbzZegNQXl-hflqGmj8bDB9q5ORwKAZlglJJpK8fNoomKJWLmA7SxpNPvgDxbS46Cp6Q8ByJiB7Vp8EipJ5shiScMoj8Y5AZjxJEYhSsoQzHoqRQ4SU2DziDcBQaZW4Pqapw6PQ" "sLTV5kmh6fy45k4TZI49hQ9Q0m5YsmIQv8N1Vl4la5FTls2wobCAcmvFKvI-KTJkyrGcm82LpRe62U9Z8vn6TzpdBAXYagDSNI75biGMicBM74gyJ2dcpBRnDduqgK2ZhaZWgx0cbA")
      
      rm ${job_ids_file}
      
      for i in ${archive_ids[@]}; do
        aws glacier initiate-job --vault-name ${vault_name} \
        --account-id - \
        --job-parameters "{\"Type\": \"archive-retrieval\", \"ArchiveId\": \"$i\", \"Tier\": \"Expedited\"}" \
        --output text \
        --query 'jobId' >> ${job_ids_file}
      done
      

      所有作业启动后,我运行第二个脚本开始下载档案。

      #!/usr/bin/env bash
      
      export vault_name=my-vault
      # store all the job ids into an array called "job_ids"
      export job_ids=$(<job_ids.log)
      
      for j in ${job_ids[@]}; do
          echo job: ${j}
          aws glacier get-job-output \
            --vault-name ${vault_name} \
            --account-id - \
            --job-id ${j} \
            ${j}.tar
      done
      

      第二个脚本下载所有档案并将文件名保存为&lt;job_id&gt;.tar

      请记住,第二个脚本必须在第一个脚本完成后的 24 小时内执行。

      【讨论】:

        猜你喜欢
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-15
        相关资源
        最近更新 更多