如何在 makefile 中承担 iam 角色

How to assume iam role in makefile

如何在 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 中无效。它似乎没有保持会话。我也尝试过使用环境变量,但也不走运。

这是 Make 的默认行为:“配方”中的每一行都由单独的 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 应用的额外限制。