AWS Data Pipeline 授权问题

AWS Data Pipeline authorization issue

我正在尝试设置一个预定的 activity 来启动和停止 ec2 实例。我的活动失败,出现以下错误:

A client error (UnauthorizedOperation) occurred when calling the StartInstances operation:You are not authorized to perform this operation. Encoded authorization failure message:....

我的 cli activity 是这样的:

  aws ec2 describe-instances  --region us-west-2 --filter "Name=tag:auto-start,Values=yes" "Name=instance-state-name,Values=stopped" --query 'Reservations[*].Instances[*].[InstanceId]' --output text |xargs aws ec2 start-instances  --region us-west-2  --instance-i

我需要提供我的 access/secret 键作为附加参数吗?由于我的访问权限有限,我无法更新数据管道策略。但是我可以使用 aws cli 工具启动和停止实例。

我正在写一个答案,因为我的提案需要一些细节。

为了安排这类事情,我建议使用 lambda,因为它更具成本效益且更直接。

AWS lambda 现在支持 scheduled events,然后您可以使用 sdk 进行 cli 调用(当前支持的语言是 python、node.js 和 java)。

例如,启动实例的快速 lambda 函数如下所示(未测试):

import boto3
def lambda_handler(event, context):
    ec2.create_instances(ImageId='<ami-image-id>', MinCount=1, MaxCount=5)

然后你只需要安排这个 lambda 函数(类似 cron 的系统)。另请注意附加正确的 IAM 角色/权限。 boto3 文档是 here

无论您使用的是 Lambda 还是 DataPipeline,您都需要了解与它们关联的 IAM 角色和策略。要解决您的问题,您只需将 StartInstances 权限添加到 DataPipeLineDefaultResource 角色。默认策略是只读的,没有启动实例的权限。

推荐政策:

{
     "Version": "2012-10-17",
     "Statement": [
          {
               "Effect": "Allow",
               "Action": [
                    "s3:*",
                    "ec2:Describe*",
                    "ec2:Start*",
                    "ec2:RunInstances",
                    "ec2:Stop*",
                    "datapipeline:*",
                    "cloudwatch:*"
               ],
               "Resource": [
                    "*"
               ]
          }
     ]
}

让您的 IAM 管理员创建一个允许启动实例的新策略。 AWS DataPipeline 文档包含所需信息。然后将该 IAM 策略附加到 DataPipeLineDefaultResource 角色,您的问题就解决了。一旦你解决了这个问题,你就可以考虑是否使用Lambda了。