web-dev-qa-db-ja.com

Ansible Cloudwatchルールが失敗した呼び出しを報告する

私はそれをテストするとき、そして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モジュールを使用してバージョンをデフォルトに設定する方法はありますか?

12
Bastian

私もこれで数時間を失いました、同じエラーと同じ混乱(なぜ失敗した呼び出しのログがないのですか?)私は "解決策"を共有します、それは誰かに問題を解決します、そして他の人が究極のソリューションをデバッグして見つけるのに役立ちます。

注:注意してください。これにより、任意の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イベントの所有者/作成者データで奇妙なことが起こっていると思います...おそらくバグですか?わからない。私はそれに取り組んでいきます

11
ProtheanTom

ここで回答を拡張するには 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
5
Gleb Oleg