継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

AWS Chatbot から Lambda の発火させて手動作業を自動化する

タダです.

業務で不定期ではあるけれど定型作業の依頼が非エンジニアから飛んでくる時があり,最初はすぐに済ませるため手作業で行っていたタスクを仕組み化しようと思い,AWS Chatbot を入れているので Chatbot と Lambda を使って作業を省力化したのでこの記事にまとめます.

作業の省力化のモチベーション

この取り組みのモチベーションとしては大きく2点あります.1つ目は定型作業が仕組み化できてないことです.もう1つは非エンジニアから依頼があったときにエンジニアに依頼するより非エンジニア側の作業で完結できるようにした方が効率的と考えたことです.

仕組みの検討

仕組みをどのようにしようかと考えたときにSlack でコミュニケーションをとっているため Slack で完結するようなものにしたいと思って Chatbot を使っていこうと考えました.Chatbot から Lambda を呼び出すことができるのでこの仕組みをつかっていきます.

docs.aws.amazon.com

Chatbot から Lambda を呼び出すための設定

Chatbot から Lambda を呼び出すための設定として①Chatbot の IAM ロール設定②Lambda のコードを準備します.

①Chatbot の IAM ロール設定

Chatbot の IAM ロールで Lambda を呼び出すための権限を足します.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:invokeAsync",
                "lambda:invokeFunction"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

docs.aws.amazon.com

②Lambda のコード

Lambda は CloudFront のキャッシュを無効化する処理をさせるための関数です.Slack から CloudFront の DistributionId が渡ってくるので event のパラメーターとしてとってます.

import json
import boto3
import logging
import time

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
    cf = boto3.client('cloudfront')
    distribution_id = event['distribution_id']
    logger.info('Creating invalidation')
    res = cf.create_invalidation(
        DistributionId=distribution_id,
        InvalidationBatch={
            'Paths': {
                'Quantity': 1,
                'Items': ['/*'],
            },
            'CallerReference': str(time.time())
            
        }
    )

    invalidation_id = res['Invalidation']['Id']
    logger.info('InvalidationId is %s', invalidation_id)

    logger.info('Execution complete')
    return "Complete."

以上で準備が完了です.

Slack から Lambda を発火させる

aws のボットを対象のチャンネルに招待して@aws invoke Lambda名 --payload {“distribution_id”: “DistributionId”}を実行します.すると,Would you like me to do so?とでるのでYesを押せば Lambda が発火します.StatusCodePayloadの部分も処理が完了していることを確認できました.CloudFront の画面でもログに出ている InvalidationId でキャッシュ無効化処理が完了していることも確認できたので完了です.

Slack の実行画面

f:id:sadayoshi_tada:20210626173703p:plain

Lambda の実行ログ

START RequestId: aef1bac9-a44b-4a8c-b07c-14554732243a Version: $LATEST
[INFO]  2021-06-14T03:23:52.584Z    aef1bac9-a44b-4a8c-b07c-14554732243a    Found credentials in environment variables.
[INFO]  2021-06-14T03:23:53.323Z    aef1bac9-a44b-4a8c-b07c-14554732243a    Creating invalidation
[INFO]  2021-06-14T03:23:54.304Z    aef1bac9-a44b-4a8c-b07c-14554732243a    InvalidationId is I1CA2NN7EAW1TR(CloudFront の InvalidationId)
[INFO]  2021-06-14T03:23:54.322Z    aef1bac9-a44b-4a8c-b07c-14554732243a    Function complete
END RequestId: aef1bac9-a44b-4a8c-b07c-14554732243a

CloudFront の Invalidations 画面

f:id:sadayoshi_tada:20210627105250p:plain

まとめ

Chatbot から Lambda を呼び出す処理を実装するためにやったことを整理しました.Slack でコミュニケーションをしている場合にオペレーション省力化の1つとしてこう言った手法が取れることをしれてよかったです.同じような課題を持っている方の参考になれば嬉しいです!