0

如何在 makefile 中担任 iam 角色?

我试过了:

deploy-non-prod:
    aws --version
    eval $(aws sts assume-role --role-arn arn:aws:iam::xxx:role/rl-some-role --role-session-name test | jq -r '.Credentials | "export AWS_ACCESS_KEY_ID=\(.AccessKeyId)\nexport AWS_SECRET_ACCESS_KEY=\(.SecretAccessKey)\nexport AWS_SESSION_TOKEN=\(.SessionToken)\n"')

这在 bash 中有效,但在 makefile 中无效。似乎它没有保持会话。我也尝试过使用环境变量,但也没有运气。

4

1 回答 1

1

这是 Make 的默认行为:“recipe”中的每一行都由单独的 shell 执行,因此没有任何内容从一行传递到另一行。

GNU Make 提供了.ONESHELL特殊目标,它指示 Make 为每个配方使用单个 shell。这样做的缺点是它适用于整个 Makefile,因此您没有单独执行的选项。

您可以使用反斜杠来组合多行:

mytarget:
    aws --version ; \
    eval $(aws sts assume-role ... ) ; \
    aws sts get-caller-identity

如果你这样做,在每个命令后加上分号是很重要的。您还可以使用 , 之类的条件操作&&来确保每一行在调用下一行之前都成功。

您还可以作为一个变量来保存您的访问变量,并将它们插入到您调用 AWS 操作的每一行中:

ACCESS_VARS != aws sts assume-role --role-arn arn:aws:iam::123456789012:role/SomeRole --role-session-name test | jq -r '.Credentials | "AWS_ACCESS_KEY_ID=\(.AccessKeyId) AWS_SECRET_ACCESS_KEY=\(.SecretAccessKey) AWS_SESSION_TOKEN=\(.SessionToken)"'

test:
    $(ACCESS_VARS) aws sts get-caller-identity

请注意,JQ 命令与您问题中的命令不同:如果您将环境变量设置为命令的一部分,则不要使用export.

但是,IMO 最好的解决方案是编写一个脚本来完成您的工作,然后从 Makefile 调用该脚本。这将允许您独立测试脚本,并启用完整的 shell 功能,而无需 Make 应用的额外约束。

于 2022-01-17T15:57:40.530 回答