AWS Lambda and API GatewayでAPIをデプロイ

pexels-photo-4488636-4488636.jpg

やりたいこと

  • AWS側でAPIをデプロイして、Http requestを送ることにより、AWS内のサービスるを利用する
    • つまり、HTTP requestで、AWS内のサービスを喚起すること
    • 今回は、Http requestで、AWS S3内のファイルリストを返してくれるようなサンプルなAPIを作成

事前準備

  • AWS環境
    • VPC network
      • セキュリティグループ
      • サブネット設定
    • S3バケット

Lambda側の作業

  • AWS Lambdaで関数を作成
  • 以下のように設定
    • 1から設定するを選択
    • 実行ロールは「新しいロールを作成」を選択
  • サブネットはリンクしたいAWSサービスが使っているサブネットと、該当するセキュリティグループを選択
  • private subnetを使う場合、S3にアクセスするため、エンドポイントが設定されていることを確認

  • 関数を作成します
    • 以下のサンプロコードを使う
import json
import boto3

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    bucket_name = event['bucket']
    prefix = event['prefix']

    response = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix)
    objects = response.get('Contents', [])

    object_list = [obj['Key'] for obj in objects]

    return {
        'statusCode': 200,
        'body': json.dumps(object_list)
    }
Python
  • 作成後deploy

API Gatewayを作成

  • Rest APIを作成
  • 詳細設定は以下
  • resourceを作成
  • methodを作成
    • lambda関数を選択して、リンクしたいlambda関数を選択
  • url query string parameterでパラメータを設定
  • methodを作成
  • methodを作成後、統合リクエストで編集をクリック
    • マッピングテンプレートを以下のように設定
{
  "bucket": "$input.params('bucket')",
  "prefix": "$input.params('prefix')"
}
Python

IAM Roleを編集

  • 必要なIAM policyを追加
    • 今回S3のobject listを返すためS3の権限を追加
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::snowflakbucket-gao",
                "arn:aws:s3:::snowflakebucket-gao/*"
            ]
        }
    ]
}
Python
  • Roleの信頼関係を追加
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com",
                    "apigateway.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
Python
  • これでS3の権限を追加済

リソースポリシーを更新

  • 特定のIPアドレスだけを許可したいため、以下のようにAPIのリソースポリシーを更新
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "arn:aws:execute-api:ap-northeast-1:816930416605:okx47z5rxe/*/*/*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": "114.141.124.22"
        }
      }
    }
  ]
}
Python
  • 更新後APIを再デプロイ

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注