【问题标题】:use serverless to get instance's status使用无服务器获取实例的状态
【发布时间】:2017-09-25 22:55:59
【问题描述】:

我是无服务器框架的新手,我想获取实例的状态,所以我使用了 boto3 describe-instance-status(),但我不断收到错误消息,我无权执行此类操作,尽管我拥有对所有 aws 服务的管理员访问权限;请帮忙,我是否需要更改或添加一些要识别的内容

这是我的代码:

import json
import boto3
import logging
import sys

#setup simple logging for INFO
logger = logging.getLogger()
logger.setLevel(logging.INFO)

from botocore.exceptions import ClientError


def  instance_status(event, context):
"""Take an instance Id and return its status"""
#print "ttot"
body = {}
status_code = 200
client = boto3.client('ec2')
response = client.describe_instance_status(InstanceIds=['i-070ad071'])

return response

这是我的 serverless.yml 文件

service: ec2 
provider:
  name: aws
  runtime: python2.7
  timeout: 30
  memorySize: 128
  stage: dev
  region: us-east-1
  iamRoleStatements:
    - Effect: "Allow"
      Action:
          - "ec2:DescribeInstanceStatus"
      Resource: "*"


functions:
  instance_status:
    handler: handler.instance_status
    description: Status ec2 instances

events:
  - http:
      path: ''
      method: get

这是我收到的错误消息:

"errorType": "ClientError", "errorMessage": "发生错误 (UnauthorizedOperation) 调用 DescribeInstanceStatus 时 操作:您无权执行此操作。”

【问题讨论】:

  • 您使用的是 lambda?您的 lambda 的 IAM 角色使用什么?该 IAM 角色有权执行 EC2 的资源吗?仔细检查此角色的权限。
  • 我没有指定角色,我可以在 serverless.yml 中这样做吗?使用 boto3 库最方便的是女巫角色
  • 请分享您与该角色相关的 IAM 政策。

标签: python-2.7 amazon-web-services amazon-ec2 boto3 serverless-framework


【解决方案1】:

...我拥有对所有 aws 服务的管理员访问权限...

请注意,Lambda 函数未在您的用户账户下运行。您应该在 YAML 中定义其角色和权限。

serverless.yamlprovider 部分中,添加以下内容:

iamRoleStatements:
  - Effect: Allow
    Action:
      - ec2:DescribeInstanceStatus
    Resource: <insert your resource here>

参考:https://serverless.com/framework/docs/providers/aws/guide/iam/

【讨论】:

  • 我做了同样的事情,但不知道为什么我总是收到同样的错误
  • 然后在您的原始问题中更新您的serverless.yml。也许Resource 不正确?还是缩进?
  • 我刚做了,如果不是太问,你能检查一下是否正确
  • LGTM。你重新部署了吗?在部署期间或调用 HTTP 端点时,您何时收到错误消息?仔细检查 Lambda 控制台中的内容。
  • 我在调用 http 端点时出错,在 Lambda 控制台中,它运行完美,我得到实例的状态没有问题,我检查了配置区域,我有以下角色:
【解决方案2】:

您无权执行此操作

这意味着您无权执行此操作client.describe_instance_status

有一些方法可以让你的函数获得正确的权限:

  1. 使用 IAM 角色:根据您的要求创建具有权限的 IAM 角色。然后在设置页面中为 lambda 函数分配这个 IAM 角色。所以你的 lambda 会自动获取旋转键来执行操作。
  2. 根据您的要求创建具有权限的 AccessKey/SecretKey。在 yaml 文件中设置,在你的 lambda 函数中,设置 boto3 以获取这些 access/secretKey,然后执行操作。

阅读更多来自http://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html

【讨论】:

  • 我确实在 aws 控制台中手动更改了角色以访问 boto3,它在 aws 控制台中运行良好,但是当我使用 http 端点对其进行测试时,它给了我 {"message": “内部服务器错误”} 所以我认为我需要在我的 serverless.yml 文件中添加一些内容,但不知道如何使用 serverless
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
相关资源
最近更新 更多