私はそれをテストするとき、そしてcloudwatchルールを通じて手動でcronジョブを作成するときにうまく機能するAWSラムダを作成しました。
メトリックは呼び出し(失敗ではない)として報告され、実行に関する詳細が記録されます。
次に、手動で作成したcloudwatchルールを削除して、ansibleで作成することにしました。
- 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ルールが作成されます。手動で作成されたものとの唯一の違いはターゲットにあります。ラムダのバージョン/エイリアスは、手動で作成された場合はデフォルトに設定され、バージョンに設定された場合は、対応するバージョン番号がansibleで作成された場合に設定されます。
Ansibleで作成されたcloudwatchルールは、呼び出しに失敗しただけです。
これはなぜですか?ログが表示されません。 ansibleでcloudwatchevent_ruleモジュールを使用してバージョンをデフォルトに設定する方法はありますか?
私もこれで数時間を失いました、同じエラーと同じ混乱(なぜ失敗した呼び出しのログがないのですか?)私は "解決策"を共有します、それは誰かに問題を解決します、そして他の人が究極のソリューションをデバッグして見つけるのに役立ちます。
注:注意してください。これにより、任意のAWSアカウントがラムダ関数を実行できるようになります
手動でルールターゲットを作成して関数を呼び出したので、CloudWatchから呼び出しアクセス許可をラムダに追加したと想定していますが、イベントがcli/apiによって作成されたときとによって作成されたときのソースアカウントIDは異なっているようですAWSダッシュボード/コンソール
ラムダにソースアカウント条件を追加する場合は、プリンシパル「events.amazonaws.com」からのアクセス許可を許可して、AWSアカウントを実行しないようにしてラムダを実行します(責任の下で)。
したがって、ラムダポリシーが次のようになっている場合:
{
"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イベントの所有者/作成者データで奇妙なことが起こっていると思います...おそらくバグですか?わからない。私はそれに取り組んでいきます
ここで回答を拡張するには https://docs.aws.Amazon.com/AmazonCloudWatch/latest/events/CWE_Troubleshooting.html#LAMfunctionNotInvoked 。 API経由で作成しているため、前述のようにLambdaに権限を追加する必要があります。セキュリティを損なうことなく、次のことができます。
PutRule
api呼び出しでルールを追加すると、それが返されます
{
"RuleArn": "string"
}
Lambda AddPermission呼び出しでRuleArn
を使用する
aws lambda add-permission \
--function-name MyFunction \
--statement-id MyId \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn-from-PutRule-request