دعوت های URL Lambda AWS با احراز هویت IAM و محدودیت های پرتاب

مقدمه:
این پست وبلاگ جزئیات چگونگی فراخوانی ایمن از توابع Lambda AWS را با استفاده از URL های Lambda با تأیید هویت AWS IAM و محدودیت های پرتاب برای اضافه کردن امنیت بیشتر به عملکرد Lambda ارائه می دهد. این شامل تنظیم زیرساخت های لازم با استفاده از AWS CloudFormation ، تولید AWS Signature نسخه 4 برای درخواست های تأیید شده و آزمایش تنظیمات با استفاده از خط فرمان و ابزار تست مانند Postman است.
درباره پروژه:
از سناریوی مورد استفاده کنید: فراخوانی توابع لامبدا از محیط های مختلف. این تنظیم اجازه می دهد تا توابع Lambda از محیط های مختلف ، از جمله زیرساخت های غیر AWS ، مانند محیط های محلی ، سرورهای داخلی استفاده شود.
برای درخواست های غیرمجاز یا لرزان که از عملکرد لامبدا استفاده نمی کنند ، هیچ هزینه ای متحمل نمی شود. در اینجا نکات کلیدی:
فشار و همزمان: تنظیم ReservedConcurrentExecutions
تعداد اعدام های همزمان را محدود می کند. در صورت رسیدن به حد مجاز ، درخواست های اضافی مورد بررسی قرار می گیرد و برای این درخواست های پرتاب هیچ هزینه ای متحمل نمی شود.
شکست های مجوز: درخواستهایی که به دلیل خطاهای مجوز (به عنوان مثال ، اعتبار IAM نامعتبر) شکست می خورند ، منجر به فراخوانی عملکرد لامبدا نمی شوند. این درخواست ها فقط توسط سرویس IAM انجام می شود و هیچ هزینه ای برای این درخواست های غیرمجاز متحمل نمی شود.
امنیت اضافی: AWS Shield Standard به طور خودکار برای توابع Lambda در دسترس است. اطلاعات بیشتر را می توان در اینجا یافت.
نظارت: نظارت بر عملکرد لامبدا می تواند با ایجاد زنگ هشدار CloudWatch بر اساس متریک “دریچه گاز” مفید باشد.
منابع و پیوندهای مفید:
تأیید اعتبار مستندات: AWS S3 – درخواست های تأیید اعتبار.
نمونه هایی از ایجاد امضاهای AWS SIGV4 در زبان های مختلف برنامه نویسی: نمونه های امضای AWS SIGV4.
توجه: URL های عملکردی در برخی از مناطق پشتیبانی نمی شوند. اطلاعات بیشتر را می توان در اینجا یافت.
در generate_sigv4.sh
فیلمنامه:
#!/bin/sh
# Request parameters
METHOD="POST"
SERVICE="lambda"
REQUEST_PAYLOAD='{"inputText": "Request to Lambda."}' # simple payload
# Environment variables
AWS_ACCESS_KEY=$AWS_ACCESS_KEY_ID
AWS_SECRET_KEY=$AWS_SECRET_ACCESS_KEY
REGION=$AWS_REGION
HOST=$LAMBDA_FUNCTION_HOST
ENDPOINT="https://${HOST}/"
# Check if environment variables are set
if [ -z "$AWS_ACCESS_KEY" ] || [ -z "$AWS_SECRET_KEY" ] || [ -z "$HOST" ]; then
echo "Error: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and LAMBDA_FUNCTION_HOST must be set as environment variables."
exit 1
fi
# Get the current date and time
AMZ_DATE=$(date -u +"%Y%m%dT%H%M%SZ")
DATE_STAMP=$(date -u +"%Y%m%d")
# Create a canonical request
CANONICAL_URI="https://dev.to/"
CANONICAL_QUERYSTRING=""
CANONICAL_HEADERS="content-type:application/json\nhost:${HOST}\nx-amz-date:${AMZ_DATE}\n"
SIGNED_HEADERS="content-type;host;x-amz-date"
PAYLOAD_HASH=$(printf "$REQUEST_PAYLOAD" | openssl dgst -sha256 | sed 's/^.* //')
CANONICAL_REQUEST="${METHOD}\n${CANONICAL_URI}\n${CANONICAL_QUERYSTRING}\n${CANONICAL_HEADERS}\n${SIGNED_HEADERS}\n${PAYLOAD_HASH}"
# Create a string to sign
ALGORITHM="AWS4-HMAC-SHA256"
CREDENTIAL_SCOPE="${DATE_STAMP}/${REGION}/${SERVICE}/aws4_request"
STRING_TO_SIGN="${ALGORITHM}\n${AMZ_DATE}\n${CREDENTIAL_SCOPE}\n$(printf "$CANONICAL_REQUEST" | openssl dgst -sha256 | sed 's/^.* //')"
# Create the signing key
kSecret=$(printf "AWS4${AWS_SECRET_KEY}" | xxd -p -c 256)
kDate=$(printf "${DATE_STAMP}" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"$kSecret" | sed 's/^.* //')
kRegion=$(printf "${REGION}" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"$kDate" | sed 's/^.* //')
kService=$(printf "${SERVICE}" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"$kRegion" | sed 's/^.* //')
kSigning=$(printf "aws4_request" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"$kService" | sed 's/^.* //')
# Create the signature
SIGNATURE=$(printf "$STRING_TO_SIGN" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"$kSigning" | sed 's/^.* //')
# Create the authorization header
AUTHORIZATION_HEADER="${ALGORITHM} Credential=${AWS_ACCESS_KEY}/${CREDENTIAL_SCOPE}, SignedHeaders=${SIGNED_HEADERS}, Signature=${SIGNATURE}"
# Output the necessary information for test tool like Postman
echo "Endpoint: ${ENDPOINT}\n"
echo "x-amz-date: ${AMZ_DATE}\n"
echo "Authorization: ${AUTHORIZATION_HEADER}\n"
echo "Payload: ${REQUEST_PAYLOAD}\n"
# Output the curl command
echo "curl -X ${METHOD} \"${ENDPOINT}\" -H \"Content-Type: application/json\" -H \"x-amz-date: ${AMZ_DATE}\" -H \"Authorization: ${AUTHORIZATION_HEADER}\" -d '${REQUEST_PAYLOAD}'\n"
پیش نیازها:
قبل از شروع ، اطمینان حاصل کنید که شرایط زیر برآورده می شود:
- یک حساب AWS با مجوزهای ایجاد منابع.
- AWS CLI https://aws.amazon.com/cli/ نصب شده در دستگاه محلی.
- OpenSSL نصب شده در محیط آزمایش.
استقرار:
1. مخزن را کلون کنید.
git clone https://gitlab.com/Andr1500/lambda-url-with-iam-auth.git
2. سهمیه اعدام همزمان عملکرد لامبدا را بررسی کرده و افزایش دهید (در صورت لزوم).
aws service-quotas get-service-quota \
--service-code lambda \
--quota-code L-B99A9384
aws service-quotas request-service-quota-increase \
--service-code lambda \
--quota-code L-B99A9384 \
--desired-value 100
3. در تمام پارامترهای لازم در الگوی زیرساخت/root.yAML cloudformation و ایجاد پشته CloudFormation.
aws cloudformation create-stack \
--stack-name invoke-lambda-url-iam-auth \
--template-body file://infrastructure/root.yaml \
--capabilities CAPABILITY_NAMED_IAM \
--disable-rollback
4. برای تنظیم متغیرهای محیط ، بازده خروجی ها را انجام دهید.
aws cloudformation describe-stacks \
--stack-name invoke-lambda-url-iam-auth \
--query "Stacks[0].Outputs" --output json
5.SET SETION منطقه ، میزبان عملکرد Lambda ، دسترسی و کلیدهای مخفی برای کاربر ایجاد شده IAM به عنوان متغیرهای محیط در محیط آزمایش.
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_REGION=
export LAMBDA_FUNCTION_HOST=
6. تولید AWS Signature V4 و درخواست ارسال را با استفاده از generate_sigv4.sh
فیلمنامه
./generate_sigv4.sh
curl -X POST "https://...on.aws/" -H "Content-Type: application/json" -H "x-amz-date: 20240619T150022Z" -H "Authorization: AWS4-HMAC-SHA256 Credential=/20240619//lambda/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=" -d '{"inputText": "Request to Lambda."}'
آزمایش از خط فرمان و پستچی:
7. پشته CloudFormation را حذف کنید.
aws cloudformation delete-stack --stack-name invoke-lambda-url-iam-auth
نتیجه گیری:
این پروژه نشان می دهد که چگونه می توان با استفاده از URL های Lambda با تأیید هویت IAM ، عملکردهای AWS Lambda را به طور ایمن فراخوانی کرد. امنیت اضافی را می توان با محدودیت های پرتاب و نظارت بر عملکرد Lambda با آلارم CloudWatch اضافه کرد.
اگر این پست را مفید و جالب دیدید ، لطفاً روی دکمه کلیک کنید تا پشتیبانی خود را نشان دهید. در صورت تمایل به استفاده و به اشتراک گذاشتن این پست. 🙂