2016-07-01 42 views
5

我试图调用运行情况,并通过所产生的实例ID作为输入如下创建标签作为一个班轮:有没有办法将一个AWS CLI命令的输出作为输入流向另一个?

aws ec2 run-instances \ 
    --image-id ami-1234 \ 
    --output text \ 
    --query Instances[*].InstanceId | \ 
aws ec2 create-tags \ 
    --tags 'Key="foo",Value="bar"' 

当尝试,我得到如下:

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters] 
To see help text, you can run: 

    aws help 
    aws <command> help 
    aws <command> <subcommand> help 
aws: error: argument --resources is required 

是这样的可能或者不得不求助于使用变量(或其他方式我没有考虑)?

其他背景

的问这个问题的动机是,这样的事情是可能的AWS工具适用于Windows PowerShell;我希望能用AWS CLI完成同样的事情。

等效PowerShell的例子:

New-EC2Instance -ImageId ami-1234 | 
    ForEach-Object Instances | 
    ForEach-Object InstanceId | 
    New-EC2Tag -Tag @{key='foo';value='bar'} 
+1

您需要编写脚本来捕获第一个命令的输出并将其作为参数提供给第二个命令。你正在使用的管道没有办法工作,它怎么知道如何将文本输入到管道中? –

+0

这就是我所怀疑的,我只是想确定。使用AWS PowerShell工具(命令声明“来自管道的值”属性),FWIW可以实现这种功能,但这更多的是PowerShell的功能,而不是AWS命令。 –

+0

@MarkB'create-tags'需要一个'resources'参数,它是实例Id(可以是一个列表,但在这种情况下它将是单个值)来标记哪个是刚刚启动并从'run-instnace'命令的查询结果。我错过了什么吗? –

回答

9

它可以通过利用xargs的{}捕捉实例ID将其送入创建标签的--resources参数来完成。

aws ec2 run-instances \ 
    --image-id ami-1234 \ 
    --output text \ 
    --query Instances[*].[InstanceId] | \ 
xargs -I {} aws ec2 create-tags \ 
    --resources {} \ 
    --tags 'Key="foo",Value="bar"' 

注意,与原来的问题的例子中,在括号包裹--query参数值的“实例ID”部分是很重要的,所以如果一个调用与--count大于一个运行实例,返回的多个实例ID将作为单独的行输出,而不是制表符分隔。请参阅http://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html#controlling-output-format

+0

真诚感谢壳课程;恐怕我在这个上显示了我的Linux无知。只要我每次轮换一个实例(这符合我的问题的公平性),这很有效。当--count大于1时(再次显示我的Linux无知),我无法确定如何使其正常工作。如果您有时间/倾向,您是否可以更新答案来解释多个实例? –

+2

FWIW,多个实例无法正常工作的原因与--query参数值有关:在我的示例中,它返回多个实例ID制表符分隔。使用--query参数值中的括号中的“InstanceId”来解决问题。我会更新答案。感谢您的帮助@Frédéric –

+0

谢谢拉斐尔 - 我根据您的建议更新了答案,因为我看到它被拒绝了,但认为它是完全合理的 –

相关问题