まくろぐ

AWS Lambda をコマンドライン (CLI) で操作する

更新:
作成:

Lambda 関数の一覧を取得する (lambda list-functions)

$ aws lambda list-functions --max-items 10
関数名だけ取り出す
$ aws lambda list-functions --max-items 10
      --query "Functions[].FunctionName"
Node.js 10 を使ってる関数の ARN を調べる
$ aws lambda list-functions --function-version ALL --output text
      --query "Functions[?Runtime=='nodejs10.x'].FunctionArn

AWS から来た「Node.js 10 のサポート切れるから乗り換えてね」というメール (2021-06-04) に書かれていたやり方です。

Lambda 関数の情報を取得する (lambda get-function)

$ aws lambda get-function --function-name my-function
{
    "Configuration": {
        "FunctionName": "my-function",
        "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:my-function",
        "Runtime": "nodejs12.x",
        "Role": "arn:aws:iam::123456789012:role/lambda-ex",
        "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=",
        "Version": "$LATEST",
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff",
        ...
    },
    "Code": {
        "RepositoryType": "S3",
        "Location": "https://awslambda-ap-northeast-1-tasks.s3.ap-northeast-1.amazonaws.com/snapshots/123456789012/my-function-4203078a-b7c9-4f35-..."
    }
}

Lambda 関数のデプロイパッケージをダウンロードするために使用できる、Lambda 関数メタデータと署名付き URL が含まれています。

Lambda 関数を作成する (lambda create-function)

$ aws lambda create-function
      --function-name my-function \
      --runtime nodejs12.x \
      --handler index.handler \
      --zip-file fileb://function.zip \
      --role arn:aws:iam::123456789012:role/lambda-ex
{
    "FunctionName": "my-function",
    "FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:my-function",
    "Runtime": "nodejs12.x",
    "Role": "arn:aws:iam::123456789012:role/lambda-ex",
    "Handler": "index.handler",
    "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff",
    ...
}

タグを付けるときは、関数の作成時に次のようなオプションを追加します。

--tags Department=Marketing,CostCenter=1234ABCD

Lambda 関数を削除する (lambda delete-function)

$ aws lambda delete-function --function-name my-function

Lambda 関数の ZIP パッケージをアップロードする (lambda update-function-code)

aws lambda update-function-code \
    --function-name my-function \
    --zip-file fileb://function.zip
{
    "FunctionName": "my-function",
    "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
    "Runtime": "nodejs12.x",
    "Role": "arn:aws:iam::123456789012:role/lambda-role",
    "Handler": "index.handler",
    "CodeSha256": "Qf0hMc1I2di6YFMi9aXm3JtGTmcDbjniEuiYonYptAk=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "Active"
    },
    "RevisionId": "983ed1e3-ca8e-434b-8dc1-7d72ebadd83d",
    ...
}

Lambda 関数を呼び出す (lambda invoke)

Lambda 関数のレスポンスをファイルに取得する
$ aws lambda invoke --function-name my-function output.yml
ExecutedVersion: $LATEST
StatusCode: 200

$ cat output.yml
{"body": "Hello World!", "statusCode": 200}

Lambda 関数のリソースベースポリシー設定

Lambda のリソースベースポリシーは、他のサービスからの Lambda 関数へのアクセス許可設定を保持しています。 Lambda 関数は 1 つの リソースベースポリシー を持ち、その中にアクセス権限を表現する複数の ステートメント が含まれている、という構成になります。

Lambda 関数 ◇── ポリシー x 1 ◇── ステートメント x N

ステートメントを追加する (lambda add-permission)

他のサービスに Lambda 関数を呼び出す権限を与えるには、Lambda 関数のリソースベースポリシーに、ステートメントを追加します。

例: すべての SNS トピックからの呼び出しを許可
$ aws lambda add-permission \
      --function-name my-function \
      --action lambda:InvokeFunction \
      --statement-id sns \
      --principal sns.amazonaws.com \

Statement: '{"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:ap-northeast-1:123456789012:function:my-function"}'

この例では、sns という名前のステートメントを Lambda 関数のポリシーに追加しています。 コマンドの実行結果として、追加されたステートメントの内容(JSON 形式)が出力されます。 ここで割り当てたステートメント ID(上記の例では sns)は、ステートメントを削除する場合などに使用します。

上記の例では、すべての SNS トピックからのアクセスを許可していますが、特定の SNS トピックからの Lambda 関数呼び出し (lambda:InvokeFunction) を許可するには、--source-arn パラメータを追加で指定します。

例: 特定の SNS トピックからの呼び出しを許可
$ aws lambda add-permission \
      --function-name my-function \
      --action lambda:InvokeFunction \
      --statement-id sns-my-topic \
      --principal sns.amazonaws.com \
      --source-arn arn:aws:sns:ap-northeast-1:123456789012:my-topic

Statement: '{"Sid":"sns-my-topic","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:ap-northeast-1:123456789012:function:my-function","Condition":{"ArnLike":{"AWS:SourceArn":"arn:aws:sns:ap-northeast-1:123456789012:my-topic"}}}'

例外的に S3 バケットの ARN にはアカウント ID が含まれないため、特定のアカウントの S3 バケットからのアクセスを許可するには、source-account パラメータでアカウントを指定する必要があります。

例: 特定の S3 バケットからの呼び出しを許可
$ aws lambda add-permission \
      --function-name my-function \
      --action lambda:InvokeFunction \
      --statement-id s3-account \
      --principal s3.amazonaws.com \
      --source-arn arn:aws:s3:::my-bucket-123456 \
      --source-account 123456789012

ステートメントを削除する (lambda remove-permission)

例: sns という名前のポリシーステートメントを削除
$ aws lambda remove-permission \
      --function-name my-function \
      --statement-id sns

リソースベースポリシーを取得する (lambda get-policy)

例: 関数に設定されたポリシーを表示
$ aws lambda get-policy \
     --function-name my-function \
     --query "Policy" --output text

{"Version":"2012-10-17","Id":"default","Statement":[{"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:ap-northeast-1:123456789012:function:my-function"},{"Sid":"sns-my-topic","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:ap-northeast-1:123456789012:function:my-function","Condition":{"ArnLike":{"AWS:SourceArn":"arn:aws:sns:ap-northeast-1:123456789012:my-topic"}}}]}

Lambda 関数のリソースベースポリシーの内容は、上記のような一行の JSON テキストとして保存されているので、そのままでは見にくいかもしれません。 下記はこの JSON レスポンスを Ruby で YAML 形式に整形する例です。

$ aws lambda get-policy \
      --function-name my-function \
      --query "Policy" --output text \
      | ruby -ryaml -e 'puts YAML.load(STDIN).to_yaml'
---
Version: '2012-10-17'
Id: default
Statement:
- Sid: sns
  Effect: Allow
  Principal:
    Service: sns.amazonaws.com
  Action: lambda:InvokeFunction
  Resource: arn:aws:lambda:ap-northeast-1:123456789012:function:my-function
- Sid: sns-my-topic
  Effect: Allow
  Principal:
    Service: sns.amazonaws.com
  Action: lambda:InvokeFunction
  Resource: arn:aws:lambda:ap-northeast-1:123456789012:function:my-function
  Condition:
    ArnLike:
      AWS:SourceArn: arn:aws:sns:ap-northeast-1:123456789012:my-topic

この Lambda 関数のポリシーとしては、snssns-my-topic というステートメントで、外部からのアクセスを許可していることがわかります。

Lambda 関数のタグを制御する

タグを追加する (lambda tag-resource)

$ aws lambda tag-resource \
      --resource arn:aws:lambda:ap-northeast-1:123456789012:function:my-func
      --tags Department=Marketing,CostCenter

タグを削除する (lambda untag-resource)

$ aws lambda untag-resource \
      --resource arn:aws:lambda:ap-northeast-1:123456789012:function:my-func
      --tag-keys Department

タグの一覧を取得する (lambda list-tags)

$ aws lambda list-tags \
      --resource arn:aws:lambda:ap-northeast-1:123456789012:function:my-func
Tags:
  Key1: Value1
  Key2: Value2
  Key3: Value3

ARN じゃなくて関数名で取得したいのであれば、get-function で。

$ aws lambda get-function \
      --function-name my-func --query "Tags"
Key1: Value1
Key2: Value2
Key3: Value3

関連記事

まくろぐ
サイトマップまくへのメッセージ