{"id":17169159,"url":"https://github.com/rnag/aws-teams-logger","last_synced_at":"2026-05-15T12:33:09.423Z","repository":{"id":49593388,"uuid":"373652710","full_name":"rnag/aws-teams-logger","owner":"rnag","description":"Python MS Teams and Email logger for AWS environments","archived":false,"fork":false,"pushed_at":"2021-06-12T22:20:21.000Z","size":601,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-02T15:48:42.284Z","etag":null,"topics":["aws","aws-lambda","lambda","logging","ms-teams","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rnag.png","metadata":{"files":{"readme":"README.md","changelog":"HISTORY.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-06-03T22:04:41.000Z","updated_at":"2022-02-19T22:31:48.000Z","dependencies_parsed_at":"2022-09-15T03:30:25.332Z","dependency_job_id":null,"html_url":"https://github.com/rnag/aws-teams-logger","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rnag/aws-teams-logger","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rnag%2Faws-teams-logger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rnag%2Faws-teams-logger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rnag%2Faws-teams-logger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rnag%2Faws-teams-logger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rnag","download_url":"https://codeload.github.com/rnag/aws-teams-logger/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rnag%2Faws-teams-logger/sbom","scorecard":{"id":779249,"data":{"date":"2025-08-11","repo":{"name":"github.com/rnag/aws-teams-logger","commit":"8a7234fa77d1b731befb4b9389307e0390f0dd08"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Code-Review","score":0,"reason":"Found 0/12 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":7,"reason":"3 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T04:29:56.821Z","repository_id":49593388,"created_at":"2025-08-23T04:29:56.821Z","updated_at":"2025-08-23T04:29:56.821Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33067270,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T11:35:32.926Z","status":"ssl_error","status_checked_at":"2026-05-15T11:35:31.362Z","response_time":103,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","aws-lambda","lambda","logging","ms-teams","python"],"created_at":"2024-10-14T23:25:15.309Z","updated_at":"2026-05-15T12:33:09.403Z","avatar_url":"https://github.com/rnag.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AWS Teams Logger\n\nAWS Teams Logger is a Python library that forwards errors (failures) and log\nmessages to a MS Teams channel, and an optional list of *Developer Emails*\nwho may need to be notified; the emails use HTML formatting which is\noriginally designed for MS Outlook and Teams. This library is primarily intended\nfor use in an AWS environment.\n\nThis package exposes the below decorator classes which handle the posting\nof **warning** level or above log messages by default (via the builtin `logging` module)\nto a specified Microsoft Teams channel. Log messages with an `exc_info` parameter,\nas well as any uncaught exceptions, will also be sent to a list of Dev Emails (if provided)\nin addition to being logged to the Teams channel.\n\n**Available Decorators**:\n\n  * `LambdaLogger` - The main use case is to decorate a handler for\n    an AWS Lambda function in the Python runtime. For decorating multiple lambda handlers,\n    it is useful to invoke the helper method `decorate_all_functions`.\n    \n\n  * `TaskLogger` - Intended to be run in ECS environment, such as\n    functions (or class methods) that are run in an ECS or Fargate task.\n    However, this can also be used to decorate any generic functions as well.\n    Note that the task needs to be using *platform version 1.4* \n    (see the [note below](#note-on-ecs-tasks) for more details)\n\n\n  * `BulkLambdaLogger`, `BulkTaskLogger` - The decorator classes that start with *Bulk*\n    are functionally identical to their above counterparts, but prefer to send emails in bulk where\n    possible. Use this implementation when it is expected that multiple logs will be sent to Teams\n    or Outlook, as there will be a performance increase with a *Bulk*\n    logger.\n    See the below section on [Bulk Loggers](#bulk-loggers) for more info.\n\n## Usage\n\nSimple Usage for a stand-alone AWS Lambda function:\n\n```python3\nfrom aws_teams_logger import LambdaLogger\nfrom logging import getLogger\nfrom typing import Dict, Any\n\nlog = getLogger(__name__)\nlog.setLevel('INFO')\n\n# By default, only logs from this library at the 'WARNING' level and above\n# should show up in CloudWatch. This specifies the minimum log level at which\n# library logs appear in CloudWatch.\n# getLogger('aws_teams_logger').setLevel('INFO')\n\n# Note: this is a simplified example, and assumes you define the required\n# environment variables. Otherwise, you'd need to pass the parameters\n# to the decorator class like `@LambdaLogger(teams_email='my-teams-email')\n# in this case.\n\n@LambdaLogger\ndef my_lambda_handler(event: Dict[str, Any], context: Any):\n    ...\n    other_func()\n    ...\n\ndef other_func():\n    # Message is not logged to Teams (default log level is \"WARN\")\n    log.info('Info level log')\n    # This message will be forwarded to Teams\n    log.warning('Sample Warn message')\n    # Messages with the `exc_info` parameter will be logged to both\n    # the Teams Channel and any subscribed Dev Emails via Outlook\n    try:\n        empty_dict = {}\n        value = empty_dict['missing key']\n    except KeyError:\n        log.exception('Key missing from `empty_dict`')\n    # Uncaught errors will be logged to both Teams and any Dev Emails\n    finally:\n        result = 1 / 0\n```\n\n... or for a module with multiple handlers, common for serverless projects with\n    multiple Lambdas:\n\n```python3\nfrom aws_teams_logger import LambdaLogger\nfrom logging import getLogger\n\nlog = getLogger()\nll = LambdaLogger(enabled_lvl='WARNING')\n\ndef my_handler_1(event, context):\n    # This message won't be sent to Teams, as the minimum lvl here is 'WARNING'\n    log.info('Hello world!')\n    # Build a custom Exception object - a `ValueError` in this case -\n    # which will be forwarded to Teams and also any Devs via email\n    err = ValueError('My sample error details.')\n    log.error('This is an error log with a sample exception object', exc_info=err)\n\ndef my_handler_2(event, context):\n    # This message will be sent to Teams by default, though this behavior\n    # can be overridden via the 'enabled_lvl' parameter above, or alternatively\n    # via the 'TEAMS_LOG_LVL' environment variable defined for the lambda.\n    log.warning('Help! something went wrong')\n\n# Now, decorate all the lambda handlers declared above\nll.decorate_all_functions(ses_identity='my@identity.org',\n                          teams_email='abc123.my.domain@amer.teams.ms',\n                          dev_emails='user1@my.domain.org,user2@mydomain.org')\n```\n\n... or use it to decorate one or more ECS tasks:\n\n```python3\nimport logging\nfrom aws_teams_logger import TaskLogger\n\nlog = logging.getLogger(__name__)\n\n# Logs from this library won't show up by default. This will enable reporting\n# of logs above a specified level. You can alternatively define the 'LOG_CFG'\n# environment variable, which does the same thing.\nlogging.basicConfig(level='WARNING')\n\nclass MyTaskClass:\n\n    @classmethod\n    @TaskLogger\n    def my_task_func(cls, *args, **kwargs):\n        ...\n        cls.other_func()\n        ...\n\n    @staticmethod\n    def other_func():\n        # TODO add logic here; see examples for logging above\n        ...\n```\n\n... when multiple emails will be sent using the same template,\nit might be more performant to use a Bulk Logger as shown below:\n\n```python3\nfrom aws_teams_logger import BulkLambdaLogger\nfrom logging import getLogger\n\nlog = getLogger()\n\n@BulkLambdaLogger\ndef my_lambda_handler(event, context):\n    log.info(\"This %s message shouldn't be sent via email\", 'Info')\n    for i in range(5):\n        log.error('Testing %d ...', i + 1)\n    ...\n```\n\n## Installing Teams Logger and Supported Versions\n\nAWS Teams Logger is available on PyPI:\n\n```shell\npip install aws-teams-logger\n```\n\nThis package officially supports **Python 3.7** or higher.\n\n## Screenshots\n\nCheck out the [docs/images](https://github.com/RNag/aws-teams-logger/tree/main/docs/images) folder for screenshots\nof sample email messages as they show up in MS Teams and Outlook.\n\n## About\n\nThis library decorates (overrides) the base logger methods in the `logging` module to also\npost log messages above a set level to a Teams channel.\n\nThe library also posts to target destinations via email currently; it doesn't currently\nsupport Teams connectors. It uses [Amazon SES](https://aws.amazon.com/ses/details/)\nto  format the error and log messages that will be sent to MS Teams and Outlook.\nTherefore, you will first need to set up SES and allow permissions for the\ndecorated function to send emails via the SES service, as explained below.\n\n### Conditional Dependencies\n\nNote that `boto3` is not included in package requirements by default,\nsince an AWS Lambda environment is assumed.\n\nIf running on a Docker environment such as ECS or Fargate, you\ncan use the following to ensure that all dependencies are installed:\n\n```shell\npip install aws-teams-logger[standalone]\n```\n\n## Initial Setup\n\n### SES\n\n#### Add Required Templates\n\nThe library uses SES templates to format email messages sent to MS Teams and Outlook.\n\nUse the below helper function to add the required templates to the desired AWS account:\n\n```python\nfrom aws_teams_logger import upload_templates\n\n\nupload_templates(profile_name='my-aws-profile')\n```\n\n#### Set up an SES Identity\n\nAdd and verify an identity from the Amazon SES console under your\naccount. For testing purposes, it might be preferable to use a personal email address\nas it'll be easier to verify it.\n\n#### Turn off Sandbox Mode\n\nEnable _Production Access_ from the SES console. This will enable\nus to send outbound emails without needing to verify each recipient email\nseparately.\n\n### Teams\n\nUse the steps below to find the email address for the MS teams channel to stream\nthe logs to:\n\n1. Click on the _three dots_ to the right of the channel name\n2. Select 'Get email address'\n3. Here we only need to use the email address.\n\n   For example, given `Channel name \u003cabc123.my.domain@amer.teams.ms\u003e`\n   we only need the value that is enclosed in brackets.\n\n## Permissions\n\nThe execution IAM role will need the following minimum permissions:\n\n```json\n[\n    {\n        \"Effect\": \"Allow\",\n        \"Action\": [\n            \"ses:Send*Email\"\n        ], \n        \"Resource\": \"*\"\n    }, \n  \n    {\n        \"Effect\": \"Allow\", \n        \"Action\": \"iam:ListAccountAliases\", \n        \"Resource\": \"*\"\n    }\n]\n```\n\nNote that if you set the AWS account name (either via the `set_account_name` function or\nthe `AWS_ACCOUNT_NAME` environment variable) then you don't need to add the second\npermission to retrieve the account alias from IAM.\n\nExample of setting the AWS account name:\n```python\nfrom aws_teams_logger import set_account_name\n\n\nset_account_name('my-account-alias')\n```\n\n## Required Values\n\nThe library requires certain values that need to either be passed in as parameters to the decorators\n(or alternatively to the `decorate_all_functions` method for lambda functions),\nor which need to be present in the environment.\n\nThe following minimum values are required to use the decorator methods (otherwise\nit should log an error):\n\n* _SES Identity_ - Sender email address that was previously validated with SES.\n* _MS Teams Email_ - The email address (ex: abc123.my.domain@amer.teams.ms) to send\n  log messages and unhandled errors to.\n\n## Parameters\n\nThe resolution logic for parameters will use the environment variables\nfirst if they are available.\n\n\nThe following table lists the parameter names as used with the decorators,\nalong with the environment variables that will be used if provided.\nNote that the resolution order is from left to right.\n\n| Env Variable | Parameter | Example | Description |\n| --- | --- | --- | --- |\n| `SES_IDENTITY` | `ses_identity` | sender@my.domain.org | Sender or outbound email, must be validated in the SES console |\n| `TEAMS_EMAIL` | `teams_email` | abc123.my.domain@amer.teams.ms | The email to send log messages or failures (e.g. uncaught exceptions) to |\n| `TEAMS_LOG_LVL` | `enabled_lvl` | WARNING | The minimum log level for messages sent to Teams |\n| `DEV_EMAILS` | `dev_emails` | user1@my.domain.org,user2@my.domain.org | Comma delimited list of dev emails, if provided will send stylized HTML to them when any uncaught exceptions are raised |\n| `AWS_ACCOUNT_NAME` | `set_account_name()` | my-account-dev | AWS Account Alias. If defined, will be used instead of making a call to `iam:ListAccountAliases` to retrieve the alias of the current AWS account. |\n| `SOURCE_CODE` | - | https://github.com/abc/repo | A link to the source code repo (such as Bitbucket) for the project. |\n| `AWS_LOG_GROUP` | - | my-cw-log-group | Only applies when the `TaskLogger` decorator is used. Determines the log group to link to in the AWS console. Generally this is not needed to be specified (see note on 'ECS Tasks' below) |\n| `AWS_REGION` | - | us-east-1 | AWS Region, should be automatically set for AWS Lambda functions. Determines the region in which to invoke the SES service, as well as the default region for Lambda and Task contexts. |\n| `LOG_CFG` | - | INFO | If specified, sets up logging via `logging.basicConfig`. Also determines the minimum level at which messages logged by this library show up in CloudWatch. If this is a valid path to a file, the contents will be passed to `logging.config.dictConfig` instead. \n| `LOCAL_TZ` | - | US/Eastern | User's local time zone, passed in to `pytz.timezone`; used when generating the date/time in the subject for a Teams or Devs email message.\n\n### Advanced Config\n\nThe decorator parameters `logger_cls` and `log_func_name` together determine the base log\nfunction to decorate.\n\nBy default, we decorate the `logging.Logger._log`\nmethod, which is the base method used by all logger methods in the Python `logging` library.\n\n## Note on ECS Tasks\n\nThe decorator retrieves ECS metadata on the currently running task\nwhen posting messages to Teams or via email. It will automatically\nretrieve data from the Task Metadata V4 endpoint, if this is\navailable.\n\nTo enable correct data reporting for the the V4 endpoint,\nset the `Platform Version` for the task to **1.4.0** or higher as\nmentioned in the article below.\n\nhttps://docs.aws.amazon.com/AmazonECS/latest/userguide/task-metadata-endpoint-v4-fargate.html\n\n## Bulk Loggers\n\nThe _Bulk_ logger implementations will send templated emails in bulk,\ne.g. via the ``ses:SendBulkTemplatedEmail`` API call. Use this\nimplementation when it is expected that multiple logs will be sent via\nthe same SES template, as there will be a performance increase when using a _Bulk_\nlogger. Note that there is a separate template for\nsending a message to Teams and Outlook. \n\nPlease see the tests under the [perf_tests/](./tests/integration/perf_tests) directory for a\nperformance comparison between the _Individual_ (default) vs _Bulk_ Loggers.\n\n### Considerations\nSome important considerations when choosing a *Bulk* Logger:\n\n* As we want to bulk send emails where possible, emails are sent in batches once each decorated\n  function returns.\n* Because emails are sent in bulk, it's expected that the messages will be out of order.\nFor example, a message logged at the end of a decorated function might show up earlier than\n  a message logged at the start of the function.\n  * As a general rule, use the time listed on the `subject` header in the Teams message; this is the time\n    at when the message was originally logged. Note that this might not always align with\n  timestamp that Teams lists for when the message was delivered.\n\n## Common Issues\nThis section describes common errors that might show up, along with the steps to resolve them.\n\n### Template Not Found\n\n#### Example\n```\naws_teams_logger - ERROR - Template [send-to-teams | send-to-outlook] does not exist; please call `upload_templates` to upload the required SES templates.\n```\n\n#### Resolution\n\nAs mentioned, you will need to call the `upload_templates` function to\nadd the required SES templates to the AWS account.\n\n```python\nfrom aws_teams_logger import upload_templates\n\nupload_templates(profile_name='my-aws-profile')\n```\n\nExpected output:\n```\naws_teams_logger - INFO - [ send-to-teams ]\naws_teams_logger - INFO - Uploading SES template...\naws_teams_logger - DEBUG - send-to-teams: creating template, as it does not exist\naws_teams_logger - INFO -   SUCCESS\naws_teams_logger - INFO - [ send-to-outlook ]\naws_teams_logger - INFO - Uploading SES template...\naws_teams_logger - DEBUG - send-to-outlook: creating template, as it does not exist\naws_teams_logger - INFO -   SUCCESS\n```\n\n### Unable to Send Email\n\n#### Example\n```\nAn error occurred (AccessDenied) when calling the SendTemplatedEmail operation: User `arn:aws:iam::1234567890:user/my-user' is not authorized to perform `ses:SendTemplatedEmail' on resource `arn:aws:ses:us-east-1:1234567890:identity/sender@my.domain.org'\n```\n\n#### Resolution\n\nUpdate the attached IAM role to allow the `ses:SendTemplatedEmail` action as discussed above.\n\n\n### Unable to Determine Account Name\n\n#### Example\n```\naws_teams_logger - ERROR - Unable to retrieve the account alias, please ensure the attached role has the necessary permissions (iam:ListAccountAliases). Error: An error occurred (AccessDenied) when calling the ListAccountAliases operation: User: arn:aws:iam::1234567890:user/my-user is not authorized to perform: iam:ListAccountAliases on resource: *\n```\n\n#### Resolution\n\nUpdate the attached IAM role to allow the `iam:ListAccountAliases` action as discussed above.\n\nYou can also set the `AWS_ACCOUNT_NAME` environment variable or call `set_account_name()`, and this will eliminate\nthe need of an API call made to IAM to retrieve the alias of the current account.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frnag%2Faws-teams-logger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frnag%2Faws-teams-logger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frnag%2Faws-teams-logger/lists"}