0

je suis nouveau à un framework sans serveur et je veux obtenir le statut d'une instance, donc j'ai utilisé boto3 describe-instance-status() mais je continue d'obtenir erreur que je ne suis pas autorisé à effectuer ce genre d'opération bien que j'ai un accès administrateur à tous les services aws; S'il vous plaît aider, ai-je besoin de changer ou d'ajouter quelque chose à être reconnuutiliser serverless pour obtenir le statut de l'instance

voici mon code:

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 

et voici mon fichier 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 

et est ici la message d'erreur que je reçois:

"errorType": "ClientError", "errorMessage": « Une erreur est survenue (Unautho rizedOperation) lors de l'appel de l'opération DescribeInstanceStatus : Vous n'êtes pas autorisé à effectuer cette opération. "

+2

Vous utilisez lambda? Quel est le rôle IAM de votre lambda? Ce rôle IAM a-t-il l'autorisation d'exécuter la ressource EC2? double vérifier l'autorisation de ce rôle. –

+0

Je n'ai pas spécifié de rôle, est-ce que je pourrais le faire dans serverless.yml? Le rôle de sorcière est le plus pratique pour travailler avec la bibliothèque boto3 – ner

+0

Veuillez partager votre politique IAM attachée avec le rôle. –

Répondre

0

Vous n'êtes pas autorisé à effectuer cette opération

Cela signifie que vous n'êtes pas autorisé à effectuer cette action client.describe_instance_status.

Il des façons de rendre votre fonction peut obtenir la permission droite:

  1. Utilisation IAM Rôle: Créer IAM rôle avec la permission accroding à vos besoins. Attribuez ensuite ce rôle IAM à la fonction lambda dans la page de configuration. Ainsi, votre lambda obtiendra automatiquement la clé de rotation pour effectuer des actions.
  2. Créez AccessKey/SecretKey avec l'autorisation d'accroding à vos besoins. Dans le fichier yaml, dans votre fonction lambda, définissez boto3 pour accéder à ces access/secretKey, puis effectuez une action.

Lire la suite de cette http://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html

+0

J'ai changé de rôle à la main dans la console aws pour avoir accès à boto3, ça marche très bien dans la console aws, mais quand je le test avec le point de fin http ça me donne {"message": "Internal server error"} Je pense que je dois ajouter quelque chose à mon sans serveur.fichier yml, mais je ne sais pas comment le faire en utilisant serverless – ner

1

... j'ai accès administrateur à tous les services de SSFE ...

Prenez note que la fonction Lambda est pas en cours d'exécution sous votre compte utilisateur . Vous êtes censé définir son rôle et ses autorisations dans votre YAML.

Dans la section provider dans votre serverless.yaml, ajoutez ce qui suit:

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

Référence: https://serverless.com/framework/docs/providers/aws/guide/iam/

+0

j'ai fait la même chose, mais je ne sais pas pourquoi je continue à obtenir la même erreur – ner

+0

Mettez à jour votre serverless.yml dans votre question originale alors. Peut-être que la 'Resource' est incorrecte? Ou l'indentation? – dashmug

+0

je viens de le faire, s'il vous plaît si ce n'est pas trop demander, pouvez-vous vérifier si c'est correct – ner