2017-04-12 90 views
2

我創建了AWS lambda,在我測試它時以及在通過cloudwatch規則手動創建cron作業時運行良好。Ansible Cloudwatch規則報告失敗調用

它將指標報告爲調用(未失敗)並記錄有關執行的詳細信息。

然後,我決定刪除手動創建的cloudwatch規則,以便創建一個具有合理性的規則。

- name: Create lambda service. 
    lambda: 
     name: "{{ item.name }}" 
     state: present 
     zip_file: "{{ item.zip_file }}" 
     runtime: 'python2.7' 
     role: 'arn:aws:iam::12345678901:role/lambda_ecr_delete' 
     handler: 'main.handler' 
     region: 'eu-west-2' 
     environment_variables: "{{ item.env_vars }}" 
    with_items: 
     - name: lamda_ecr_cleaner 
     zip_file: assets/scripts/ecr-cleaner.zip 
     env_vars: 
      'DRYRUN': '0' 
      'IMAGES_TO_KEEP': '20' 
      'REGION': 'eu-west-2' 
    register: new_lambda 

    - name: Schedule a cloudwatch event. 
    cloudwatchevent_rule: 
     name: ecr_delete 
     schedule_expression: "rate(1 day)" 
     description: Delete old images in ecr repo. 
     targets: 
     - id: ecr_delete 
      arn: "{{ item.configuration.function_arn }}" 
    with_items: "{{ new_lambda.results }}" 

創建幾乎完全相同的cloudwatch規則。我可以看到手動創建的唯一區別是在目標中,lambda版本/別名在設置爲版本時手動創建時設置爲默認值,當創建時使用相應的版本號。

用ansible創建的cloudwatch規則只有失敗的調用。

任何想法,爲什麼這是?我看不到任何日誌。有沒有一種方法可以將版本設置爲Default以及cloudwatchevent_rule模塊是否適用?

+0

你解決了這個問題嗎?我遇到類似的問題。 Ansible創建成功,但事件失敗。如果我編輯並保存事件規則(無變化),它開始工作... – apines

+0

不,我沒有找到解決方案。如果你找到一個請讓我知道。 – Bastian

回答

4

我也因此失去了數小時,同樣的錯誤和相同的困惑(爲什麼沒有失敗的調用日誌?),我將分享我的「」解決方案「」,它將解決問題給別人,並幫助他人調試並找到最終解決方案。

注:要當心,這可能會允許任何AWS賬戶執行你的lambda函數

既然你有通過手動創建規則目標調用該函數,我假設你添加了調用權限從CloudWatch的拉姆達,但是當事件由cli/api創建並且由AWS儀表板/控制檯創建時,源賬戶ID看起來有所不同如果您要在來自主體的lambda調用權限中添加源賬戶條件「 events.amazonaws.com「,以防止任何AWS賬戶執行您的lambda只是刪除它(在您的責任!)。

所以,如果你的拉姆達的政策是這樣的:

{ 
    "Sid": "<sid>", 
    "Effect": "Allow", 
    "Principal": { 
     "Service": "events.amazonaws.com" 
    }, 
    "Action": "lambda:InvokeFunction",, 
    "Condition": { 
     "StringEquals": { 
      "AWS:SourceAccount": "<account-id>" 
     } 
    }, 
    "Resource": "arn:aws:lambda:<region>:<account-id>:function:<lambda-function>" 
} 

刪除了 「條件」 字段

{ 
    "Sid": "sid", 
    "Effect": "Allow", 
    "Principal": { 
     "Service": "events.amazonaws.com" 
    }, 
    "Action": "lambda:InvokeFunction",, 
    "Resource": "arn:aws:lambda:<region>:<account-id>:function:<lambda-function>" 
} 

和 「也許」,它將爲你工​​作。

當cli/api創建事件時,我覺得它與cloudwatch事件所有者/創建者數據發生的奇怪事情......可能是一個錯誤?不確定。我會繼續努力

+0

令人驚歎。與那一個失去了幾個小時。我們一直在爲Lambda函數創建各種不同類型的觸發器,並且在包含AWS:SourceAccount時它們都可以工作。事件似乎有所不同。我想他們必須來自不同的帳戶。調度程序本身可能無法在我們自己的AWS賬戶中運行。確切地說, –

+0

。我爲Lambda函數(包括AWS:SourceAccount條件)創建了S3觸發器,但沒有問題,但使用aws-cli創建的CloudWatch事件不起作用,如果您在儀表板中運行良好,則可以。我認爲當由api創建時,事件所有者並沒有被正確定義。 – ProtheanTom