AWS SSM 运行 命令:使用 Cloudformation 模板中的当前帐号
AWS SSM Run command : use the current account number from a Cloudformation Template
我有一个 CloudFormation 模板,它创建了一组 SSM 命令来管理我的 Linux EC2 实例。此命令必须有权访问我的 AWS 帐号才能执行某些任务。
在我的 CloudFormation 模板上,我做了:
AWSTemplateFormatVersion: '2010-09-09'
Description: Sample SSM commands
MyCommand1:
Type: AWS::SSM::Document
Properties:
DocumentType: Command
Content:
schemaVersion: "2.2"
parameters: {}
mainSteps:
- action: aws:runShellScript
name : command1
inputs:
runCommand:
- echo "this command run on the selected EC2 instance" && echo "You are running this on account {{global:ACCOUNT_ID}}"
Outputs:
Command1ID:
Description: MyCommand1
Value: !Ref MyCommand1
此模板安装该功能,我可以从 SSM Web 控制台运行它。
但是{{global:ACCOUNT_ID}}没有计入我的帐号。它的值为字符串“{{global:ACCOUNT_ID}}”。所以我认为这不是从 SSM 命令使用全局变量的好语法。
因此,在阅读此处的文档后 https://docs.aws.amazon.com/systems-manager/latest/userguide/walkthrough-cli.html 我尝试仅通过 CLI 对其进行测试(以快速测试其他语法):
$> sh_command_id=$(aws ssm send-command --instance-ids "i-0cb0c0ea8ef7339f1" --document-name "AWS-RunShellScript" --parameters commands='echo You are running this on account {{global:ACCOUNT_ID}}' --output text --query "Command.CommandId")
但命令因解析错误而失败 Error parsing parameter '--parameters': Expected: ',', received: '}' for input
在 SSM "runCommand" 操作中使用 {{global:*}} 的正确语法是什么?
您将无法使用 ACCOUNT_ID
的内置变量。使用 SSM,您是 运行 实例上的命令,而此命令不理解 ACCOUNT_ID。基于云形成模板,我假设您 运行 在基于 *ix 的系统上。
一种方法是在您的实际命令中使用它:
ACCOUNT_ID=`curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | grep accountId| awk '{print }'|sed 's/"//g'|sed 's/,//g'` && echo "this command run on the selected EC2 instance" && echo "You are running this on account ${ACCOUNT_ID}"
这使用 ec2 instance metadata 计算帐户 ID。
您可以使用 Fn::Sub
函数实现此目的:
- !Sub 'echo "this command run on the selected EC2 instance" && echo "You are running this on account ${AWS::AccountId}"'
我有一个 CloudFormation 模板,它创建了一组 SSM 命令来管理我的 Linux EC2 实例。此命令必须有权访问我的 AWS 帐号才能执行某些任务。
在我的 CloudFormation 模板上,我做了:
AWSTemplateFormatVersion: '2010-09-09'
Description: Sample SSM commands
MyCommand1:
Type: AWS::SSM::Document
Properties:
DocumentType: Command
Content:
schemaVersion: "2.2"
parameters: {}
mainSteps:
- action: aws:runShellScript
name : command1
inputs:
runCommand:
- echo "this command run on the selected EC2 instance" && echo "You are running this on account {{global:ACCOUNT_ID}}"
Outputs:
Command1ID:
Description: MyCommand1
Value: !Ref MyCommand1
此模板安装该功能,我可以从 SSM Web 控制台运行它。
但是{{global:ACCOUNT_ID}}没有计入我的帐号。它的值为字符串“{{global:ACCOUNT_ID}}”。所以我认为这不是从 SSM 命令使用全局变量的好语法。
因此,在阅读此处的文档后 https://docs.aws.amazon.com/systems-manager/latest/userguide/walkthrough-cli.html 我尝试仅通过 CLI 对其进行测试(以快速测试其他语法):
$> sh_command_id=$(aws ssm send-command --instance-ids "i-0cb0c0ea8ef7339f1" --document-name "AWS-RunShellScript" --parameters commands='echo You are running this on account {{global:ACCOUNT_ID}}' --output text --query "Command.CommandId")
但命令因解析错误而失败 Error parsing parameter '--parameters': Expected: ',', received: '}' for input
在 SSM "runCommand" 操作中使用 {{global:*}} 的正确语法是什么?
您将无法使用 ACCOUNT_ID
的内置变量。使用 SSM,您是 运行 实例上的命令,而此命令不理解 ACCOUNT_ID。基于云形成模板,我假设您 运行 在基于 *ix 的系统上。
一种方法是在您的实际命令中使用它:
ACCOUNT_ID=`curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | grep accountId| awk '{print }'|sed 's/"//g'|sed 's/,//g'` && echo "this command run on the selected EC2 instance" && echo "You are running this on account ${ACCOUNT_ID}"
这使用 ec2 instance metadata 计算帐户 ID。
您可以使用 Fn::Sub
函数实现此目的:
- !Sub 'echo "this command run on the selected EC2 instance" && echo "You are running this on account ${AWS::AccountId}"'