2017-08-16 5 views
1

J'utilise la fonction! Sub dans mes modèles CloudFormation Yaml. Et quand il est utilisé comme une valeur de propriété de l'objet, il travaille pour moiAWS Cloud Formation! Fonctions Sub &! Ref dans les politiques AWS :: Serverless :: Function

Object: 
    Property1: !Sub some-value-with-a-${variable}-in-it 

La valeur de la variable sera remplacé comme prévu.

Cependant, je ne peux pas comprendre comment utiliser la fonction Sub! Dans un élément d'un tableau de chaînes

Array: 
    - !Sub some-value-with-a-${variable}-in-it 

élément de tableau devient juste ignoré.

J'essaie ceci dans le contexte d'un modèle SAM créant une ressource de type AWS :: Serverless :: Function. La propriété des politiques peut prendre un tableau de chaînes:

lambda: 
    Type: AWS::Serverless::Function 
    Properties: 
    CodeUri: api 
    FunctionName: !Sub api-${MyStageName} 
    Handler: Lambda:Api.Function::HandleAsync 
    Runtime: dotnetcore1.0 
    Policies: 
    - AWSLambdaBasicExecutionRole 
    - !Sub arn:aws:iam::${AWS::AccountId}:policy/some-policy 
    - arn:aws:iam::123456789:policy/another-policy 

La fonction Sous travaille dans la propriété FunctionName dans cet exemple. Mais je finis avec seulement 2 politiques attachées à mon rôle généré - AWSLambdaBasicExecutionRole et arn:aws:iam::123456789:policy/another-policy. Celui qui inclut la fonction !Sub est ignoré.

J'ai essayé des options comme mettre la fonction sur une nouvelle ligne:

Array: 
    - 
    !Sub some value with a ${variable} in it 

Quelqu'un peut-il aider?

Mise à jour

Melo a fait remarquer @ Tom que ce n'est pas un problème de tableau, donc je l'ai réglé ma question.

Une enquête plus approfondie a révélé qu'il est pas un problème de formation nuage exactement, mais très spécifique au type de ressource AWS::Serverless::Function, et la propriété Policies au sein. Je soupçonne que cela a quelque chose à voir avec le fait que la propriété Policies est si flexible dans ce qu'il peut accepter. Il peut accepter des chaînes faisant référence à des noms de politique ou à Arns, et peut également accepter des documents de politique décrivant une nouvelle politique. Je soupçonne que cela signifie qu'il n'est pas capable de supporter les fonctions.

+0

Il ne devrait pas y avoir de différence dans l'utilisation de '! Sub' avec un élément de tableau ou une valeur de mappage. Cela semble être un bug et devrait être signalé comme tel. J'essaierais de citer le scalaire après '! Sub'; Peut-être que c'est un bug de l'analyseur et si oui, cela pourrait être une solution de contournement. – flyx

+0

Merci pour la réponse. Les citations ne fonctionnaient pas, donc je vais essayer d'enregistrer un bug –

+0

Problème créé: https://forums.aws.amazon.com/thread.jspa?threadID=261756 –

Répondre

1

Apparemment, il n'y a rien de mal avec! Sous-fonction dans un tableau d'éléments.

J'ai essayé de créer la pile suivante sur CloudFormation et cela a fonctionné:

AWSTemplateFormatVersion: '2010-09-09' 
Description: 'IAM Roles Template' 

Parameters: 
    ArnBase: 
    Type: String 
    Default: arn:aws:iam::aws:policy/ 
    AWSLambdaFullAccess: 
    Type: String 
    Default: AWSLambdaFullAccess 
    AmazonSESFullAccess: 
    Type: String 
    Default: AmazonSESFullAccess  

Resources: 

    LambdaRole: 
    Type: AWS::IAM::Role 
    Properties: 
     AssumeRolePolicyDocument: 
     Version: "2012-10-17" 
     Statement: 
      Effect: Allow 
      Principal: 
      Service: lambda.amazonaws.com 
      Action: sts:AssumeRole   
     Policies: 
     - 
      PolicyName: CloudFormationFullAccess 
      PolicyDocument: 
      Version: "2012-10-17" 
      Statement: 
       - 
       Effect: "Allow" 
       Action: "cloudformation:*" 
       Resource: "*"  
     ManagedPolicyArns:   
     - !Sub ${ArnBase}${AWSLambdaFullAccess}   
     - !Sub ${ArnBase}${AmazonSESFullAccess} 
     - !Sub arn:aws:iam::${AWS::AccountId}:policy/CustomAmazonGlacierReadOnlyAccess 

Cela devrait fonctionner en utilisant SAM soit ...

+0

C'est intéressant. Merci d'avoir exclu cela. On dirait que ma question doit être plus spécifique. Peut-être que c'est SAM, ou peut-être que c'est la propriété des politiques sur le type de fonction sans serveur. Je vais enquêter plus loin. –

0

Solution

Le type de ressource AWS::Serverless::Function soutient plusieurs façons de configurer l'accès. Reportez-vous aux stratégies directement via la propriété Policies et demandez à l'infrastructure de créer un rôle qui a ces stratégies.

  • La propriété Role peut faire référence à un rôle qui contient déjà des stratégies. J'utilisais l'option 1, mais l'option 2 s'avère être un moyen de contourner les problèmes avec la fonction !Sub.

    La création d'un rôle explicitement avec les stratégies que nous voulons utiliser le AWS::IAM::Role signifie que nous pouvons utiliser la fonction !Sub dans la propriété ManagedPolicyArns. Par exemple

    role: 
        Type: AWS::IAM::Role 
        Properties: 
        ... 
        ManagedPolicyArns: 
         - !Sub arn:aws:iam::${AWS::AccountId}:policy/some-policy 
        ... 
    lambda: 
        Type: AWS::Serverless::Function 
        Properties: 
        ... 
        Role: !GetAtt role.Arn 
        ...