【问题标题】:aws s3 command does not work in a batch file triggered by a Windows task scheduleraws s3 命​​令在 Windows 任务计划程序触发的批处理文件中不起作用
【发布时间】:2014-07-23 19:38:40
【问题描述】:

我有一个批处理文件C:\upload_to_s3.bat。在这个文件中,有一行:

aws s3 sync D:\S3\batch1\ s3://MyBucket/batch1 --exclude *.bat

我有 Windows 任务计划程序“S3 Hourly Sync”,它每小时运行一次以触发运行C:\upload_to_s3.bat。但是这个命令没有做任何事情 - 文件上传从未发生过。

如果我双击C:\upload_to_s3.bat,它会完美运行。

这是 Windows 2008 标准服务器。我已经安装了 AWS CLI 并使用命令“aws configure”进行了配置,并输入了我的访问密钥和密钥。这就是为什么如果我双击批处理文件它就会运行的原因。

Windows 任务计划程序以“[MyServer]/Administrator”帐户运行。

那么为什么“aws s3 sync”命令在任务调度器触发时不起作用?

是否需要在“aws s3 sync”之前添加一行来先设置凭据?如果有,怎么做?

谢谢!

【问题讨论】:

  • 您在运行aws configure 时是否以[MyServer]\Administrator 身份登录? aws configure 命令被记录为使用~/.aws/config 的配置文件(在 Windows 上,我相信这映射到“%USERPROFILE%\.aws\config”)。批处理文件用户是否存在该文件?
  • 是的,我以管理员身份登录,我可以看到文件 C:\Users\Administrator\.aws\config。还有其他想法吗?请随时提出问题 - 其中一个可能只是闪闪发光。
  • 批处理文件有输出吗?如果没有,您可以将输出捕获到文件中吗?您可能会运行另一个命令,例如列出 S3 中的文件,您可以运行该命令来安全地检查权限情况。
  • 我将新行修改为 "aws s3 sync D:\S3\batch1\ s3://MyBucket/batch1 --exclude *.bat > D:\logs\s3.txt" 输出文件为空 - 实际上甚至没有创建输出文件。执行了此行之前和之后的命令 - 这意味着任务调度程序工作正常。 “aws s3”行是唯一的问题。更多想法?
  • 可能是用户帐户控制阻止了本地文件访问?我建议尝试将本地问题与 AWS 问题分开,我会尝试通过在批处理文件中添加两行来捕获文本输出 - 1) type "%USERPROFILE%\.aws\config" 以确保批处理文件可以读取凭据,以及 2) @987654332 @ 作为使用 AWS 凭据而不做任何事情的最小命令。两者都应该产生输出,错误与否。

标签: windows batch-file amazon-web-services amazon-s3


【解决方案1】:

在批处理文件中包含以下行:

set AWS_ACCESS_KEY_ID=your_access_key_id

set AWS_SECRET_ACCESS_KEY=your_secret_access_key

AWS Documentation

【讨论】:

  • 我给了你 +1 但后来我注意到这是一种 linux 方法。它不适用于 Windows
【解决方案2】:

我能够通过在您的 s3 命​​令之前在批处理文件中添加以下 3 行来解决问题

aws configure set AWS_ACCESS_KEY_ID <your acess key id>
aws configure set AWS_SECRET_ACCESS_KEY <your secret access key here>
aws configure set default.region eu-west-1

用您的数据替换尖括号之间的内容,用您的存储桶区域替换区域。是的,“AWS_ACCESS_KEY_ID”和密钥之间没有等号。

【讨论】:

  • 如果您按照 AWS CLI 文档进行设置,则不需要此设置。 CMD 提示:aws configure 在用户运行任务调度程序(通常是“管理员”)上,它应该自动创建c:\users\administrator\.aws\configc:\users\administrator\.aws\credentials 文件。你准备好了。注意:您也可以设置不同的配置文件。 (docs.aws.amazon.com/cli/latest/userguide/…)
  • 应该避免这种情况,因为它会直接在脚本中显示 AWS 凭证。使用通过aws configure 创建的共享凭证文件是一种更好的方法
【解决方案3】:

发生这种情况的原因是,aws 命令没有找到配置文件或凭据文件!它也发生在 Win2012 上。

问题在于 Windows 任务计划将 %USERPROFILE% 设置为 C:\Users\Default 而不是运行任务的实际用户!! ??? AWS 正在使用它来查找配置和凭证文件。

所以解决方法是在你的脚本中加入这样的东西(BAT 或 PowerShell)

:: in a BAT script
set userprofile=C:\Users\%username%

# in a PowerShell
$env:USERPROFILE = "c:\users\$env:USERNAME"

从计划任务运行时,即使 %homepath% 变量也是空白的。

我只是在拖延试图弄清楚为什么会发生这种情况后才发现这一点。

set AWS_DEFAULT_PROFILE=namedprofile
set AWS_CONFIG_FILE=C:\Users\xxxx\.aws\config

只有在我在脚本中添加上面的 AWS_CONFIG_FILE 行之前,AWS 才能真正看到配置文件!但是它现在找不到 credentials,而且我看不到如何设置它。

这是我没有告诉配置文件在哪里得到的错误:

Traceback (most recent call last):
  File "aws", line 27, in <module>
  File "aws", line 23, in main
  File "awscli\clidriver.pyc", line 50, in main
  File "awscli\clidriver.pyc", line 176, in main
  File "awscli\clidriver.pyc", line 157, in _create_parser
  File "awscli\clidriver.pyc", line 91, in _get_command_table
  File "awscli\clidriver.pyc", line 111, in _build_command_table
  File "botocore\session.pyc", line 680, in emit
  File "botocore\hooks.pyc", line 226, in emit
  File "botocore\hooks.pyc", line 209, in _emit
  File "awscli\customizations\preview.pyc", line 71, in mark_as_preview
  File "awscli\clidriver.pyc", line 349, in service_model
  File "awscli\clidriver.pyc", line 366, in _get_service_model
  File "botocore\session.pyc", line 256, in get_config_variable
  File "botocore\session.pyc", line 277, in _found_in_config_file
  File "botocore\session.pyc", line 349, in get_scoped_config
botocore.exceptions.ProfileNotFound: The config profile (backup) could not be found

然后这是我设置 AWS_CONFIG_FILE 变量后得到的错误:

Unable to locate credentials
Completed 1 part(s) with ... file(s) remaining

【讨论】:

  • 啊!!我想到了!! ...(正在编辑..呃..当我按 Enter 时,评论编辑保存?)
  • 有人请这个人喝一杯
  • 感谢您解决这个问题 - 为我节省了很多时间!
【解决方案4】:

在 windows bat 文件中,有效的是 user2415376 和 docesam 答案的组合。

这里是:

set userprofile=C:\Users\%username%
aws configure set AWS_ACCESS_KEY_ID <your_key>
aws configure set AWS_SECRET_ACCESS_KEY <your_secret>
aws configure set default.region <your_region>

other aws commands here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2013-10-19
    • 2014-03-15
    • 2013-10-18
    • 2015-06-25
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多