curl で AWS API を叩いてみた

AWS APIを叩きたくてしょうがない時に
2023.11.11

AWS CLIやAWS SDKではなく直接AWSのAPIを叩きたい

こんにちは、のんピ(@non____97)です。

皆さんはAWS CLIやAWS SDKではなく、直接AWSのAPIを叩きたいなと思ったことはありますか? 私はあります。

AWSのAPIに対してアップデートがかかると、AWS CLI v1やboto3などでもアップデートの内容がすぐに反映される認識です。ただし、万が一AWS CLI v1やboto3などがアップデートになかなか追従できない場合は「早くアップデートブログを書きたいのに書けない」というもどかしい気持ちになること間違いなしです。

そんな時に備えて、直接AWS APIを叩けられるように整理しておきたいと思います。

いきなりまとめ

  • curlで簡単にAWS APIを叩くことが可能
    • AWS Signature V4にもサポートしているよ

AWS APIを直接叩く際はAWS Signature V4で署名が必要

AWS APIを直接叩く場合は、AWS Signature V4で署名が必要です。AWS CLIやAWS SDKの場合は意識する必要はありません。

重要

AWS SDK (「サンプルコードとライブラリ」を参照) または AWS コマンドライン (CLI) ツール を使用して API リクエストを AWS に送信する場合、SDK および CLI クライアントが指定したアクセスキーを使用してリクエストを認証するため、このセクションをスキップできます。正当な理由がない限り、常に SDK または CLI を使用することをお勧めします。

. . (中略) . .

リクエストに署名するタイミング

AWS に API リクエストを送信するためのカスタムコードを記述するときは、リクエストに署名するためのコードを含める必要があります。カスタムコードを書く理由には、以下のような場合が考えられます。

  • AWS SDK がないプログラミング言語を使用しているためです。
  • AWS にリクエストを送る方法を完全に管理する必要がある場合。

AWS API リクエストの署名 - AWS Identity and Access Management

署名を作成するまでには複数のステップがあるため、さっとAPIを叩きたい時には手間です。

署名手順の概要

手順 1: 正規リクエストを作成する
リクエストのコンテンツ (ホスト、アクション、ヘッダーなど) を標準的な正規形式に変換します。正規リクエストは、署名する文字列を作成するのに使用される入力の 1 つです。詳細については、「AWS API リクエスト署名の要素」を参照してください。

手順 2: 正規リクエストのハッシュを作成する
署名キーは、最初のハッシュオペレーションのキーとして AWS のシークレットアクセスキーを使用して、リクエスト日、リージョン、およびサービスに対する一連のキー付きハッシュオペレーション (HMAC オペレーション) を実行することによって抽出します。

手順 2: 署名文字列を作成する
正規リクエストに加えてアルゴリズム、リクエスト日、認証情報スコープ、正規リクエストのダイジェスト (ハッシュ) などの追加情報を使用して、署名する文字列を作成します。

手順 4: 署名を計算する
署名キーを取得したら、署名文字列にキー付きハッシュ操作を実行することで、署名を計算します。取得した署名キーを、この操作のハッシュキーとして使用します。

手順 5: リクエストヘッダーに署名を追加します。
署名を計算したら、それをリクエストの HTTP ヘッダーまたはクエリ文字列に追加します。

署名付き AWS API リクエストを作成する - AWS Identity and Access Management

そんな少しハードルが高めなAWS Signature V4ですが、curlではcurl 7.75.0から追加された--aws-sigv4を使用することで、簡単にリクエストにAWS Signature V4の署名を付与することが可能です。

--aws-sigv4 <provider1[:provider2[:region[:service]]]>

Use AWS V4 signature authentication in the transfer.

The provider argument is a string that is used by the algorithm when creating outgoing authentication headers.

The region argument is a string that points to a geographic area of a resources collection (region-code) when the region name is omitted from the endpoint.

The service argument is a string that points to a function provided by a cloud (service-code) when the service name is omitted from the endpoint.

If --aws-sigv4 is provided several times, the last set value is used.

Example:

curl --aws-sigv4 "aws:amz:us-east-2:es" --user "key:secret" https://example.com

See also --basic and -u, --user. Added in 7.75.0.

curl - How To Use

これを使わない手はないですね。

やってみた

GET

実際にやってみます。

まず、GetFunctionを叩いてみます。

LambdaStack-LambdaD247545B-B3YfrxHrZ32gというLambda関数の情報を取得します。

実行環境はCloudShellです。

# LambdaのFull Accessを持ったIAMロールにAssume Role
$ session=$(aws sts assume-role \
  --role-arn arn:aws:iam::<AWSアカウントID>:role/LambdaFullAccess \
  --role-session-name "role_session"
)

# 取得した認証情報をセット
$ aws_access_key_id=$(echo "${session}" | jq -r ".Credentials.AccessKeyId")
$ aws_secret_access_key=$(echo "${session}" | jq -r ".Credentials.SecretAccessKey")
$ aws_session_token=$(echo "${session}" | jq -r ".Credentials.SessionToken")

# アクセス先のリージョンとサービスをセット
$ region=us-east-1
$ service=lambda

# GetFunction を叩く
$ curl "https://${service}.${region}.amazonaws.com/2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g" \
  -H "X-Amz-Security-Token: ${aws_session_token}" \
  --aws-sigv4 "aws:amz:${region}:${service}" \
  --user "${aws_access_key_id}:${aws_secret_access_key}" \
  -vs \
  | jq -r .
*   Trying 44.192.250.55:443...
* Connected to lambda.us-east-1.amazonaws.com (44.192.250.55) port 443
* ALPN: curl offers h2,http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
} [5 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
{ [5 bytes data]
* TLSv1.2 (IN), TLS handshake, Server hello (2):
{ [100 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [4976 bytes data]
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [333 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [70 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
{ [1 bytes data]
* TLSv1.2 (IN), TLS handshake, Finished (20):
{ [16 bytes data]
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=lambda.us-east-1.amazonaws.com
*  start date: Sep 24 00:00:00 2023 GMT
*  expire date: Oct 21 23:59:59 2024 GMT
*  subjectAltName: host "lambda.us-east-1.amazonaws.com" matched cert's "lambda.us-east-1.amazonaws.com"
*  issuer: C=US; O=Amazon; CN=Amazon RSA 2048 M01
*  SSL certificate verify ok.
{ [5 bytes data]
* using HTTP/2
* Server auth using AWS_SIGV4 with user '<AWS Sigv4ユーザー>'
* [HTTP/2] [1] OPENED stream for https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: lambda.us-east-1.amazonaws.com]
* [HTTP/2] [1] [:path: /2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g]
* [HTTP/2] [1] [authorization: AWS4-HMAC-SHA256 Credential=<AWS Sigv4ユーザー>/20231111/us-east-1/lambda/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token, Signature=<AWS Sigv4の署名>]
* [HTTP/2] [1] [x-amz-date: 20231111T063959Z]
* [HTTP/2] [1] [user-agent: curl/8.3.0]
* [HTTP/2] [1] [accept: */*]
* [HTTP/2] [1] [x-amz-security-token: <セキュリティトークン>]
} [5 bytes data]
> GET /2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g HTTP/2
> Host: lambda.us-east-1.amazonaws.com
> Authorization: AWS4-HMAC-SHA256 Credential=<AWS Sigv4ユーザー>/20231111/us-east-1/lambda/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token, Signature=<AWS Sigv4の署名>
> X-Amz-Date: 20231111T063959Z
> User-Agent: curl/8.3.0
> Accept: */*
> X-Amz-Security-Token: <セキュリティトークン>
> 
{ [5 bytes data]
< HTTP/2 200 
< date: Sat, 11 Nov 2023 06:40:00 GMT
< content-type: application/json
< content-length: 3573
< x-amzn-requestid: 5c6c63b8-d788-4e68-9ece-6e08c84bd16a
< 
{ [3573 bytes data]
* Connection #0 to host lambda.us-east-1.amazonaws.com left intact
{
  "Configuration": {
    "Description": "",
    "TracingConfig": {
      "Mode": "Active"
    },
    "VpcConfig": null,
    "SigningJobArn": null,
    "SnapStart": {
      "OptimizationStatus": "Off",
      "ApplyOn": "None"
    },
    "RevisionId": "12035d75-8318-4364-a4ab-100f5ba1760f",
    "LastModified": "2023-11-10T04:17:51.000+0000",
    "FileSystemConfigs": null,
    "FunctionName": "LambdaStack-LambdaD247545B-B3YfrxHrZ32g",
    "Runtime": "nodejs18.x",
    "Version": "$LATEST",
    "PackageType": "Zip",
    "LastUpdateStatus": "Successful",
    "Layers": null,
    "FunctionArn": "arn:aws:lambda:us-east-1:<AWSアカウントID>:function:LambdaStack-LambdaD247545B-B3YfrxHrZ32g",
    "KMSKeyArn": null,
    "MemorySize": 128,
    "ImageConfigResponse": null,
    "LastUpdateStatusReason": null,
    "DeadLetterConfig": null,
    "Timeout": 10,
    "Handler": "index.handler",
    "CodeSha256": "WXtx07ODdA98WKBki+olSk/Qwh7Iw9FX2mcf0STZu+k=",
    "Role": "arn:aws:iam::<AWSアカウントID>:role/LambdaStack-LambdaServiceRoleA8ED4D3B-CAYo4GRipcNH",
    "SigningProfileVersionArn": null,
    "MasterArn": null,
    "RuntimeVersionConfig": {
      "Error": null,
      "RuntimeVersionArn": "arn:aws:lambda:us-east-1::runtime:5b65a6230d1054ba2f3bcff29fe7654ff1a5453cd2cfa1a03367a850c540a9da"
    },
    "CodeSize": 581,
    "State": "Active",
    "StateReason": null,
    "Environment": {
      "Variables": {
        "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1"
      },
      "Error": null
    },
    "EphemeralStorage": {
      "Size": 512
    },
    "StateReasonCode": null,
    "LastUpdateStatusReasonCode": null,
    "Architectures": [
      "arm64"
    ]
  },
  "Concurrency": null,
  "Code": {
    "ResolvedImageUri": null,
    "RepositoryType": "S3",
    "ImageUri": null,
    "Location": "<Lambda関数のコードのロケーション>"
  },
  "Tags": {
    "aws:cloudformation:stack-name": "LambdaStack",
    "aws:cloudformation:stack-id": "arn:aws:cloudformation:us-east-1:<AWSアカウントID>:stack/LambdaStack/ba9cb9e0-7f62-11ee-9786-0e7a74670299",
    "aws:cloudformation:logical-id": "LambdaD247545B"
  }
}

AWS Signature V4で署名がされ、Lambda関数の情報を取得できていますね。

--aws-sigv4を付与しない場合は、以下のとおりです。

$ curl "https://${service}.${region}.amazonaws.com/2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g" \
  -H "X-Amz-Security-Token: ${aws_session_token}" \
  --user "${aws_access_key_id}:${aws_secret_access_key}" \
  -vs \
  | jq -r .
*   Trying 44.192.248.42:443...
* Connected to lambda.us-east-1.amazonaws.com (44.192.248.42) port 443
* ALPN: curl offers h2,http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
} [5 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
{ [5 bytes data]
* TLSv1.2 (IN), TLS handshake, Server hello (2):
{ [100 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [4976 bytes data]
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [333 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [70 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
{ [1 bytes data]
* TLSv1.2 (IN), TLS handshake, Finished (20):
{ [16 bytes data]
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=lambda.us-east-1.amazonaws.com
*  start date: Sep 24 00:00:00 2023 GMT
*  expire date: Oct 21 23:59:59 2024 GMT
*  subjectAltName: host "lambda.us-east-1.amazonaws.com" matched cert's "lambda.us-east-1.amazonaws.com"
*  issuer: C=US; O=Amazon; CN=Amazon RSA 2048 M01
*  SSL certificate verify ok.
{ [5 bytes data]
* using HTTP/2
* Server auth using Basic with user '<Basic認証のユーザー>'
* [HTTP/2] [1] OPENED stream for https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: lambda.us-east-1.amazonaws.com]
* [HTTP/2] [1] [:path: /2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g]
* [HTTP/2] [1] [authorization: Basic <Basic認証のクレデンシャル>]
* [HTTP/2] [1] [user-agent: curl/8.3.0]
* [HTTP/2] [1] [accept: */*]
* [HTTP/2] [1] [x-amz-security-token: <セキュリティトークン>]
} [5 bytes data]
> GET /2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g HTTP/2
> Host: lambda.us-east-1.amazonaws.com
> Authorization: Basic <Basic認証のクレデンシャル>
> User-Agent: curl/8.3.0
> Accept: */*
> X-Amz-Security-Token: <セキュリティトークン>
> 
{ [5 bytes data]
< HTTP/2 403 
< date: Sat, 11 Nov 2023 06:59:54 GMT
< content-type: application/json
< content-length: 42
< x-amzn-requestid: 2662ec38-4704-45ba-bb6c-75dfc69f35ee
< x-amzn-errortype: MissingAuthenticationTokenException
< 
{ [42 bytes data]
* Connection #0 to host lambda.us-east-1.amazonaws.com left intact
{
  "message": "Missing Authentication Token"
}

Authorizationヘッダーに記載の認証方式がAWS4-HMAC-SHA256ではなく、BasicであることからBasic認証をしていることが分かります。そして、403エラーとなっていますね。

POST

次にPOSTでも試します。試すAPIはCreateAliasです。

リクエストパラメーターの定義は、人力でJSON文字列を作成するのではなく、JSONで定義したものをjqに渡してあげるとスマートだと思います。(catでも動作します)

実行結果は以下のとおりです。

# LambdaのFull Accessを持ったIAMロールにAssume Role
$ session=$(aws sts assume-role \
  --role-arn arn:aws:iam::<AWSアカウントID>:role/LambdaFullAccess \
  --role-session-name "role_session"
)

# 取得した認証情報をセット
$ aws_access_key_id=$(echo "${session}" | jq -r ".Credentials.AccessKeyId")
$ aws_secret_access_key=$(echo "${session}" | jq -r ".Credentials.SecretAccessKey")
$ aws_session_token=$(echo "${session}" | jq -r ".Credentials.SessionToken")

# アクセス先のリージョンとサービスをセット
$ region=us-east-1
$ service=lambda

# リクエストパラメーターを定義
$ request_parameters=$(jq -c . << 'EOF'
{
   "Description": "alias test",
   "FunctionVersion": "$LATEST",
   "Name": "alias"
}
EOF
)

# CreateAlias を叩く
$ curl "https://${service}.${region}.amazonaws.com/2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g/aliases" \
  -H "X-Amz-Security-Token: ${aws_session_token}" \
  -H "content-type: application/json" \
  --aws-sigv4 "aws:amz:${region}:${service}" \
  --user "${aws_access_key_id}:${aws_secret_access_key}" \
  -XPOST -d "${request_parameters}" \
  -vs \
  | jq -r .

*   Trying 44.192.249.232:443...
* Connected to lambda.us-east-1.amazonaws.com (44.192.249.232) port 443
* ALPN: curl offers h2,http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
} [5 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
{ [5 bytes data]
* TLSv1.2 (IN), TLS handshake, Server hello (2):
{ [100 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [4976 bytes data]
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [333 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [70 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
{ [1 bytes data]
* TLSv1.2 (IN), TLS handshake, Finished (20):
{ [16 bytes data]
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=lambda.us-east-1.amazonaws.com
*  start date: Sep 24 00:00:00 2023 GMT
*  expire date: Oct 21 23:59:59 2024 GMT
*  subjectAltName: host "lambda.us-east-1.amazonaws.com" matched cert's "lambda.us-east-1.amazonaws.com"
*  issuer: C=US; O=Amazon; CN=Amazon RSA 2048 M01
*  SSL certificate verify ok.
{ [5 bytes data]
* using HTTP/2
* Server auth using AWS_SIGV4 with user '<AWS Sigv4ユーザー>'
* [HTTP/2] [1] OPENED stream for https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g/aliases
* [HTTP/2] [1] [:method: POST]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: lambda.us-east-1.amazonaws.com]
* [HTTP/2] [1] [:path: /2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g/aliases]
* [HTTP/2] [1] [authorization: AWS4-HMAC-SHA256 Credential=<AWS Sigv4ユーザー>/20231111/us-east-1/lambda/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-security-token, Signature=<AWS Sigv4の署名>]
* [HTTP/2] [1] [x-amz-date: 20231111T080430Z]
* [HTTP/2] [1] [user-agent: curl/8.3.0]
* [HTTP/2] [1] [accept: */*]
* [HTTP/2] [1] [x-amz-security-token: <セキュリティトークン>]
* [HTTP/2] [1] [content-type: application/json]
* [HTTP/2] [1] [content-length: 71]
} [5 bytes data]
> POST /2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g/aliases HTTP/2
> Host: lambda.us-east-1.amazonaws.com
> Authorization: AWS4-HMAC-SHA256 Credential=<AWS Sigv4ユーザー>/20231111/us-east-1/lambda/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-security-token, Signature=<AWS Sigv4の署名>
> X-Amz-Date: 20231111T080430Z
> User-Agent: curl/8.3.0
> Accept: */*
> X-Amz-Security-Token: <セキュリティトークン>
> content-type: application/json
> Content-Length: 71
> 
} [71 bytes data]
< HTTP/2 201 
< date: Sat, 11 Nov 2023 08:04:30 GMT
< content-type: application/json
< content-length: 250
< x-amzn-requestid: 3e9ceef4-64d0-4010-8d21-144cb6d045a6
< 
{ [250 bytes data]
* Connection #0 to host lambda.us-east-1.amazonaws.com left intact
{
  "AliasArn": "arn:aws:lambda:us-east-1:<AWSアカウントID>:function:LambdaStack-LambdaD247545B-B3YfrxHrZ32g:alias",
  "Description": "alias test",
  "FunctionVersion": "$LATEST",
  "Name": "alias",
  "RevisionId": "04119442-a604-44d9-b6f1-09c8362312a8",
  "RoutingConfig": null
}

リクエストが受け付けられたようですね。

GetAliasを叩いて確認します。

$ curl "https://${service}.${region}.amazonaws.com/2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g/aliases" \
  -H "X-Amz-Security-Token: ${aws_session_token}" \
  --aws-sigv4 "aws:amz:${region}:${service}" \
  --user "${aws_access_key_id}:${aws_secret_access_key}" \
  -s \
  | jq -r .
{
  "Aliases": [
    {
      "AliasArn": "arn:aws:lambda:us-east-1:<AWSアカウントID>:function:LambdaStack-LambdaD247545B-B3YfrxHrZ32g:alias",
      "Description": "alias test",
      "FunctionVersion": "$LATEST",
      "Name": "alias",
      "RevisionId": "04119442-a604-44d9-b6f1-09c8362312a8",
      "RoutingConfig": null
    }
  ],
  "NextMarker": null
}

確かにエイリアスが設定されていますね。

PUT

POSTが出来たらPUTも似たようなものですが試します。

UpdateAliasで先ほど作成したエイリアスの説明を更新します。

実行結果は以下のとおりです。

$ request_parameters=$(jq -c . << 'EOF'
{
   "Description": "alias test 2",
   "FunctionVersion": "$LATEST"
}
EOF
)

# UpdateAlias を叩く
$ curl "https://${service}.${region}.amazonaws.com/2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g/aliases/alias" \
  -H "X-Amz-Security-Token: ${aws_session_token}" \
  -H "content-type: application/json" \
  --aws-sigv4 "aws:amz:${region}:${service}" \
  --user "${aws_access_key_id}:${aws_secret_access_key}" \
  -XPUT -d "${request_parameters}" \
  -s \
  | jq -r .
{
  "AliasArn": "arn:aws:lambda:us-east-1:984900217833:function:LambdaStack-LambdaD247545B-B3YfrxHrZ32g:alias",
  "Description": "alias test 2",
  "FunctionVersion": "$LATEST",
  "Name": "alias",
  "RevisionId": "017ed654-c15d-4da0-a183-9d8cc38e128d",
  "RoutingConfig": null
}

エイリアスの更新ができました。

DELETE

最後にDeleteAliasでエイリアスを削除します。

$ curl "https://${service}.${region}.amazonaws.com/2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g/aliases/alias" \
  -H "X-Amz-Security-Token: ${aws_session_token}" \
  --aws-sigv4 "aws:amz:${region}:${service}" \
  --user "${aws_access_key_id}:${aws_secret_access_key}" \
  -XDELETE \
  -s \
  | jq -r .

特にエラーなく、実行完了しました。正常に実行された場合のレスポンスボディは空のようなので、これで問題ありません。

レスポンス要素

アクションが成功した場合、サービスは空の HTTP 本文を持つ HTTP 204 レスポンスを返します。

DeleteAlias - AWS Lambda

本当にエイリアスが削除されたのか確認します。

$ curl "https://${service}.${region}.amazonaws.com/2015-03-31/functions/LambdaStack-LambdaD247545B-B3YfrxHrZ32g/aliases" \
  -H "X-Amz-Security-Token: ${aws_session_token}" \
  --aws-sigv4 "aws:amz:${region}:${service}" \
  --user "${aws_access_key_id}:${aws_secret_access_key}" \
  -s \
  | jq -r .
{
  "Aliases": [],
  "NextMarker": null
}

確かにエイリアスは削除されているようですね。

AWS APIを叩きたくてしょうがない時に

curl で AWS API を叩いてみました。

curlがAWS Signature V4をサポートしてくれているので手間なく実行することができました。

AWS CLIではなく、AWS APIを叩きたくてしょうがない時にはぜひ試してみてください。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!