0
1

More than 1 year has passed since last update.

AWS Lambda に Python のコードを追加して API Gateway 経由で呼び出してみる

Last updated at Posted at 2023-04-10

AWS Lambda の Deploy から実行までの手順を記載。

ロール作成

role.json
{
    "Role": {
        "Path": "/",
        "RoleName": "lambda-role",
        "RoleId": "AROAXIZI44MCTVD3GM5TU",
        "Arn": "arn:aws:iam::XXXX:role/lambda-role",
        "CreateDate": "2023-04-10T18:50:45+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": [
                            "lambda.amazonaws.com"
                        ]
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}

下記のコマンドを実行してロールを追加する。

$ aws iam create-role --role-name lambda-role --assume-role-policy-document file://role.json

デプロイ準備

下記のシェルスクリプトを作成してデプロイしやすいようにする。

deploy.sh
#!/bin/sh

if [ -z ${1} ]; then
        echo "sh deploy [function name}"
        exit
fi

AWS_ROLE=arn:aws:iam::XXXX:role/lambda-role
RUNTIME='python3.8'
HANDLER='lambda_function.lambda_handler'

if [ -e ${1} ]; then
        rm -f ${1}
fi

cd ${1}
zip -r ../${1}.zip .
cd ..

COUNT=$(aws lambda list-functions | grep FunctionName | grep ${1} | wc -l )

if [ ${COUNT} -eq 0 ]; then
        aws lambda create-function --role ${AWS_ROLE} --runtime ${RUNTIME} --function-name ${1} --handler ${HANDLER} --zip-file fileb://${1}.zip
else
        aws lambda update-function-code --function-name ${1} --zip-file fileb://${1}.zip
fi

プログラム作成

下記のPythonファイルを作成する。

lambda-test-02/lambda_function.py
import json

def lambda_handler(event, context):
    # TODO implement

    print( "event:" , event )
    print( "context:", context )

    return {
        'statusCode': 200,
        'body': json.dumps('ok')
    }

下記のコマンドでデプロイする。

$ ls
deploy.sh  lambda-test-01  lambda-test-02  lambda-test-02.zip  role.json
$ sh deploy.sh lambda-test-02

AWSコンソールから確認するとFunctionsが作成されている。
キャプチャ.PNG

API Gateway はAWSコンソールから追加する。
キャプチャ.PNG

HTTP経由で実行

下記のスクリプトを作成して実行結果を確認する。

run.sh
#!/bin/sh

TARGET=https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/default/lambda-test-02

API_KEY="XXXXXXXXXXXXX"

curl -o - ${TARGET} --header "x-api-key:${API_KEY}"

CloudWatch に print の結果が出力される。(JSON Formatterで整形)

"event":{
   "resource":"/lambda-test-02",
   "path":"/lambda-test-02",
   "httpMethod":"GET",
   "headers":{
      "Accept":"*/*",
      "Host":"XXXX.execute-api.ap-northeast-1.amazonaws.com",
      "User-Agent":"curl/7.29.0",
      "X-Amzn-Trace-Id":"Root=1-643465ca-1845828804df7d67487661e2",
      "x-api-key":"XXXXXXXX",
      "X-Forwarded-For":"000.000.000.000",
      "X-Forwarded-Port":"443",
      "X-Forwarded-Proto":"https"
   },
   "multiValueHeaders":{
      "Accept":[
         "*/*"
      ],
      "Host":[
         "XXXX.execute-api.ap-northeast-1.amazonaws.com"
      ],
      "User-Agent":[
         "curl/7.29.0"
      ],
      "X-Amzn-Trace-Id":[
         "Root=1-643465ca-1845828804df7d67487661e2"
      ],
      "x-api-key":[
         "XXXXXXXX"
      ],
      "X-Forwarded-For":[
         "000.000.000.000"
      ],
      "X-Forwarded-Port":[
         "443"
      ],
      "X-Forwarded-Proto":[
         "https"
      ]
   },
   "queryStringParameters":"None",
   "multiValueQueryStringParameters":"None",
   "pathParameters":"None",
   "stageVariables":"None",
   "requestContext":{
      "resourceId":"zz4v8w",
      "resourcePath":"/lambda-test-02",
      "httpMethod":"GET",
      "extendedRequestId":"DLTXoEovNjMFgmQ=",
      "requestTime":"10/Apr/2023:19:38:50 +0000",
      "path":"/default/lambda-test-02",
      "accountId":"XXXX",
      "protocol":"HTTP/1.1",
      "stage":"default",
      "domainPrefix":"XXXX",
      "requestTimeEpoch":1681155530128,
      "requestId":"5bfbf189-9044-4c34-8c60-2ae7e0bff8b1",
      "identity":{
         "cognitoIdentityPoolId":"None",
         "cognitoIdentityId":"None",
         "apiKey":"XXXXXXXX",
         "principalOrgId":"None",
         "cognitoAuthenticationType":"None",
         "userArn":"None",
         "apiKeyId":"XXXXXXXX",
         "userAgent":"curl/7.29.0",
         "accountId":"None",
         "caller":"None",
         "sourceIp":"000.000.000.000",
         "accessKey":"None",
         "cognitoAuthenticationProvider":"None",
         "user":"None"
      },
      "domainName":"XXXX.execute-api.ap-northeast-1.amazonaws.com",
      "apiId":"XXXX"
   },
   "body":"None",
   "isBase64Encoded":false
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1