2016-01-12 25 views
5

Ho seguito il seguente post del blog da Amazon (scenario 3: attivazione di una funzione Lambda da una notifica bucket Amazon S3 in un altro account) sull'autorizzazione delle funzioni Lambda per vari usi. Vorrei configurare una funzione Lambda per accettare i messaggi SNS da account esterni (esterni all'acct con la funzione lambda).Richiamare Lambda utilizzando SNS dall'account esterno

https://aws.amazon.com/blogs/compute/easy-authorization-of-aws-lambda-functions/

Mi aspettavo di aggiungere l'autorizzazione per richiamare la funzione in remoto come segue:

$ aws lambda add-permission \ 
    --function-name MyFunction \ 
    --region us-west-2 \ 
    --statement-id Id-123 \ 
    --action "lambda:InvokeFunction" \ 
    --principal sns.amazonaws.com \ 
    --source-arn arn:aws:sns:::<topic name> \ 
    --source-account <account number> \ 
    --profile adminuser 

Allora ho tentato di andare al mio argomento SNS e impostare Lambda come endpoint, e digitare l'ARN remoto per la funzione lambda nel primo account. Questo non funziona così bene, come il punto finale si aspetta un ARN per una funzione nel conto ...

Plan B: Prova a creare la sottoscrizione tramite la CLI per aggirare la limitazione nella console ...

aws sns --profile adminuser \ 
    --region us-west-2 subscribe 
    --topic-arn arn:aws:sns:us-west-2:<account #>:<topic name> 
    --protocol lambda 
    --notification-endpoint arn:aws:lambda:us-west-2:<account id>:function:<lambda function name> 

risposta:
A client error (AuthorizationError) occurred when calling the Subscribe operation: The account <account id> is not the owner of the lambda function arn:aws:lambda:us-west-2:<account id>:function:<function name>

nessuno è stato in grado di richiamare una funzione lambda da uno SNS "remoti" a un altro account? Sono un po 'perplesso su dove forse ho sbagliato ... Sulla base della nota nel post del blog, mi aspettavo uno SNS remota al lavoro:
Note: Amazon SNS (Simple Notification Service) events sent to Lambda works the same way, with “sns.amazonaws.com” replacing “s3.amazonaws.com” as the principal.

+0

Hai trovato e risolto? –

+0

No, ancora bloccato qui purtroppo. – CloudTreading

risposta

3

è possibile se l'account fornitore autorizza la conto del consumatore che possiede il lambda per iscriversi all'argomento SNS. Questo può essere fatto in "Modifica politica argomento" sotto lo topics page.

Ecco un riepilogo dei passaggi per consentire un lambda per ascoltare un argomento SNS da un account esterno:

  1. conto dei consumatori crea lambda,
  2. conto dei consumatori aggiunge origine eventi di lambda in consolle AWS da specificando l'argomento SNS del provider ARN (non preoccuparti per i messaggi di errore qui),
  3. L'account del provider aggiunge le autorizzazioni di sottoscrizione SNS a un account IAM consumer creato nell'account AWS di terze parti (fatto tramite "modifica topic policy" menzionato sopra) ,
  4. Consumer utilizza l'account IAM dal passaggio 2 per aggiungere l'abbonamento all'account del provider utilizzando la CLI di AWS.
comando

Esempio che ha lavorato per me in precedenza per il punto 4:

aws sns subscribe --topic-arn <provider_sns_arn> --protocol lambda --notification-endpoint <consumer_lambda_arn> --profile consumer-IAM-account 
+0

Fantastico, grazie per i passaggi delineati.Per curiosità, esistono dei modi per confermare automaticamente anche l'abbonamento o questa logica deve essere gestita all'interno della funzione lambda? – CloudTreading

+0

Non è necessario confermare l'abbonamento. È pronto per essere testato dopo l'esecuzione del comando 'aws sns subscribe'. –

+0

Sto provando a fare la stessa cosa ... ma l'argomento SNS del provider è in noi-ovest-2 e la funzione Lambda target in us-east-1 in un altro account. Questa soluzione potrebbe funzionare? –

1

In Guida AWS Lambda Developer c'è un tutorial in cui vengono utilizzati i comandi AWS CLI per impostare una chiamata di una funzione lambda da SNS appartiene a un altro account.

La procedura è abbastanza simile alla procedura nella risposta accettata. L'abbonamento non deve essere confermato. Era pronto per il test subito dopo il comando aws sns subscribe.