やりたいこと
- AWS側でAPIをデプロイして、Http requestを送ることにより、AWS内のサービスるを利用する
- つまり、HTTP requestで、AWS内のサービスを喚起すること
- 今回は、Http requestで、AWS S3内のファイルリストを返してくれるようなサンプルなAPIを作成
事前準備
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
API Gatewayを作成
- 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
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"apigateway.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
Python
リソースポリシーを更新
- 特定の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