Inactive 상태의 Lambda 함수를 일괄로 시작해 준다

7885 단어 람다awscliAWS
계정에 존재하는 유휴 상태의 Lamnda 함수를 전부 기동하고 싶은 것이 있었으므로 그 방법을 메모합니다.

애초에 왜 그런 일을 하고 싶었어?



Lambda는 매우 편리하지만 몇 주 동안 유휴 상태가 계속되면 함수가 Inactive 상태가됩니다. 그리고 Inactive 상태가 된 함수를 기동하려고 하면 처음에는 기동에 실패합니다.

이 탓에 약간 트러블했기 때문에, 일단 정기적으로 계정 상에 존재하는 모든 Lambnda를 기동해 버린다고 하는 것으로, AWSCLI로 Lambda를 일괄로 기동하는 쉘을 작성했습니다.

Lambda 서비스가 구성된 리소스를 회수하기에 충분한 시간 동안 유휴 상태인 함수는 Inactive 상태로 이동합니다. Inactive 상태의 함수를 호출하면 실패하고 해당 자원이 다시 작성될 때까지 함수가 Pending 상태로 설정됩니다. 자원을 다시 작성하지 못하면 함수는 Inactive 상태로 돌아갑니다.

AWS Lambda 함수 상태 추적 보다 인용



실행 환경
$ aws --version
aws-cli/1.18.219 Python/3.6.0 Windows/10 botocore/1.19.59

$ bash --version
GNU bash, version 4.3.42(5)-release (x86_64-pc-msys)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

하지만 어떻게 시작합니까?



Lambda의 레퍼런스를 읽었습니다만, 원래 「기동한다」라고 하는 커멘드는 준비되어 있지 않다고 합니다. 기동하려면 invoke (실제로 람다를 실행하기 위한 커맨드) 밖에 준비되어 있지 않은 것 같았습니다만, 노력해 낚아 보았더니 publish-version 라는 커멘드를 발견했습니다.

Creates a version from the current code and configuration of a function. Use versions to create a snapshot of your function code and configuration that doesn't change.

AWS Lambda doesn't publish a version if the function's configuration and code haven't changed since the last version. Use UpdateFunctionCode or UpdateFunctionConfiguration to update the function before publishing a version.

본래는 함수의 버전 관리를 위한 커맨드인 것 같습니다만, 함수로 변경하지 않는 경우는 아무것도 갱신하지 않는다고 하는 것. 하지만이 명령을 실행하면 어떻게 함수가 시작되었습니다! !

그래서 이것을 이용하면 모든 함수를 시작할 수 있을 것 같습니다.

마지막으로 만들어진 쉘이 여기



make_active_all_lambda.sh
#!/bin/bash -eu

all_lambda_name_list=()
inactive_lambda_name_list=()

# 最初にアカウント上に存在するすべての関数名を取得
function get_all_lambda_name_list() {

    readonly lambda_list=$(aws lambda list-functions \
        | jq -r '.Functions')

    len=$(echo $lambda_list | jq length)
    for i in $( seq 0 $(($len - 1)) ); do
        all_lambda_name_list+=($(echo $lambda_list | jq -r .[$i].FunctionName))
    done
}

# 関数がActiveかどうかの判定
function is_lambda_active() {
    local lambda_name=$1
    local state=$(aws lambda get-function-configuration \
        --function-name $lambda_name \
        | jq -r '.State')

    if [ $state = "Active" ]; then
        echo "true"
    else
        echo "false"
    fi
}

# Activeじゃない関数だけ抽出
function filter_inactive_resources() {
    echo == following lambda is inacive ==
    for lambda_name in ${all_lambda_name_list[@]}; do
        is_active=$(is_lambda_active $lambda_name)
        if [ "${is_active}" = "false" ]; then
            echo $lambda_name
            inactive_lambda_name_list+=($lambda_name)
        fi
    done
    echo == thst\'s all ==
}

# Avctiveじゃない関数をpublish-versionする
function publish_lambda() {
    if [ ${#inactive_lambda_name_list[@]} -eq 0 ]; then
        echo there is no lambda to publish
        return 0
    fi
    for lambda_name in ${inactive_lambda_name_list[@]}; do
        echo now publishing $lambda_name
        aws lambda publish-version --function-name $lambda_name
        aws lambda wait function-active --function-name $lambda_name # 関数がActiveになるまで待つ
    done
}


get_all_lambda_name_list
filter_inactive_resources
publish_lambda


걱정되는 것



함수는 시작하는 것만으로는 돈은 들지 않을 것입니다만, AWS측에 있어서는 그렇게 하고 싶지 않은 것입니까? 만약 이 근처 자세한 사람이 있으면 가르쳐 주었으면 합니다!

가능하면 Inactive 상태에서의 invoke에서도, 실패로 하지 않고 기동시키고 나서 실행할 때까지 해 주었으면 한다.

좋은 웹페이지 즐겨찾기