CloudFormation, APIG'inizi dəyişdirmir: Bunu necə düzəltmək olar

Problem:

CloudFormation, bu mənbələri yenilədikdən sonra da, API Gateway mərhələnizi dəyişdirməz.

Ssenari:

Komandam və Lambda qaynaqları olan bir SAM şablonumuz var. AWS :: Serverless :: Api resursunu açıq şəkildə yaratmırıq, çünki Api hadisələri AWS :: Serverless :: Funksiya mənbələrində istifadə edildiyi zaman onlar bizim üçün açıq şəkildə yaradılmışdır. Fəaliyyətlərimizdə yeniləmə olan, lakin adlarını statik saxlayan bir neçə aylıq yerləri keçdik. Lambdalarımızın adlarına təqdimat versiyası da bir problem təqdim etdi. Lambdas adlarımızı dəyişdirdiyimiz zaman həmin funksiyaları tetikleyen API Gateway qaynaqlarının CloudFormation tərəfindən dəyişdiriləcəyini güman etdik, amma bu belə deyil. CloudFormation yerləşdirilməsi versiyalı ad ilə yeni bir Lambda yaratdı, lakin heç vaxt mövcud olmayan Lambdaları tetiklemek üçün axtaran API son nöqtələrini buraxaraq, API Gateway yerləşdirilməsini yeniləmədi. Bu, daxili server səhvləri ilə nəticələndi.

Məsələni təkrarlamaq üçün, səhvimizi dərk etməyimizə səbəb olan versiyalı adların tətbiqi idi. Əvvəllər belə olmamışdı, çünki əvvəllər Lambda mənbələrimizi heç vaxt versiya etməmişik, buna görə API Gateway-in yenidən yerləşdirilməsi lazım deyildi, çünki hələ də ən sonuna işarə edirdi: eyni funksiya adının canlı versiyası. Sonra Lambdalarımıza versiya edilmiş adlar əlavə etdik və tətbiqimizi işlətmək istəyərkən dərhal 501 səhv aldıq.

Həll yolları:

Yeni APIG Adı: Şablonunuzda açıq bir APİ mənbəyi varsa, istehza ilə bunu komandamızın səhvini təqdim etdiyi şəkildə həll edə bilərsiniz; bir versiya ad əlavə, lakin bu dəfə sizin APIG resurs. Bəzi blog yazıları, APIG resurs adınızın sonuna zamana işarə əlavə etməsini, digərlərinin əl ilə yeniləməsini qeyd edir. Hara yaxınlaşmağınızdan asılı olmayaraq, fikir hər yerləşdirmədə ad dəyişdirməkdir ki, CloudFormation onu yeni bir qaynaq kimi qəbul edir və yeni yerləşdirmə yaradır.

CodePipeline-dakı Lambda: Gördüyüm həll yolu, API Gateway-i təkrarlayan CodePipeline-a mərhələ əlavə etməkdir. CloudFormation dəyişikliklər sistemimin icrasından dərhal sonra oturur, API idini götürür, Lambda'ya göndərir və sonra Prod mərhələmi yenidən yerləşdirmək üçün apigateway sdk-i işə salır. Bu həll bizim üçün yaxşı bir nəticə verdi və aşağıda özünüzü həyata keçirmək üçün addımlar var.

CodePipeline-a Lambda əlavə etmək bu məsələni necə həll etdiyimi izah etdi.

Addımlar:

1 - Lambda yaradın

Lambda bu kimi bir şey görməlidir:

export.handler = async (hadisə) => {const job = hadisə ['CodePipeline.job']; cəhd edin {const parametrləri = JSON.parse (job.data.actionConfiguration. config.UserParameters);
        const {apiId} = parametrlər;
        letParams = {restApiId: apiId, mərhələ adı: 'Prod'};
        apigateway.deleteStage gözləyin (deleteParams) .promise ();
        icazə verinParams = {restApiId: apiId, təsvir: `yerləşdirmə lambda vasitəsilə yaradıldı. '}
        icazə yerləşdirilməsi = apigateway gözləyin .createDeployment (yerləşdirməParams) .promise ();
        imkan yaradınParams = {yerləşdirməId: yerləşdirmə.id, restApiId: apiId, mərhələ adı: 'Prod',};
        apigateway.createStage (createParams) gözləyin .promise ();
        let updateParams = {restApiId: apiId, mərhələName: 'Prod', patchOperations: [{olan: '*', op: "əvəz et", yol: "/ yerləşdirməId", dəyər: yerləşdirmə.id}]};
        bildir updateResult = apigateway gözləyin .updateStage (updateParams) .promise ();
əgər (yeniləməResult.deploymentId) {codepipeline.putJobSuccessResult ({jobId: job.id}) .promise (); } başqa {// uğursuz api yerləşdirilməsinin atılması barədə sns bildirişi {statusCode: 500, mesaj: "API yenilənməmişdir"}; }} tutmaq (səhv) {const failParams = {uğursuzluqDetaillər: {mesaj: error.message, type: "JobFailed"}, jobId: job.id};
const failResult = kod xətti gözləyin .putJobFailureResult (failParams) .promise (); }};

Bu Lambda'nın nə etdiyinə qısa bir baxış. Birincisi, CodePipeline işini çəkməlisiniz, çünki funksiyanın sonunda bu mərhələnin vəziyyətini "uğur" və ya "uğursuzluq" vəziyyətinə gətirməlisiniz. Boru kəmərində bir standart Lambda yapışdırarsanız, yalnız "Salam Dünya" ifadəsi yazılarsa, boru kəmərinizin Lambda ilə birlikdə səhnədə təxminən 20 dəqiqə dayanacağını görərsiniz. Ona görə ki, CodePipeline bu işin status yeniləməsi olmadan həmin mərhələdən gedə bilməz.

Sonra CodePipeline mərhələsi fəaliyyətinin qurulması zamanı İstifadəçi Parametri olaraq keçdiyiniz APIG idini tutun. Yenidən dəyişdirmək istədiyiniz mərhələni silmək üçün apigateway sdk istifadə edin. Bəli, düzgün oxudun. Sonra yeni bir yerləşdirmə və yerləşdirmək üçün yeni bir mərhələ yaradın. Nəhayət, həll edilmiş vədin dəyərini updateStage-dən götürün və bir .deployment varsa, borumuzun davam edə bilməsi üçün APIG yerləşdirilməmizin müvəffəq olduğu barədə CodePipeline-a məlumat verə biləcəyik. Hər hansı bir səhv baş verər və boru kəməri işində uğursuzluqla nəticələnəcəkdir.

İsteğe bağlı: Mən bir şərh əlavə etdim, lakin SNS bildirişinin kodunu daxil etmədim. Boru kəmərinizdə bildirişlərin olması və ya bu lambda səhvləri olduqda yeni CloudFormation yerləşdirməyinizin yeniləndiyini bildiyiniz üçün APIG etməməyiniz yaxşı olardı ki, bu da başlamış olduğunuz eyni vəziyyətdə sizi tərk edəcəkdir.

2 - Mərhələ Kod Kəmərinizə əlavə edin

CloudFormation dəyişikliklər mərhələsini icra etdikdən sonra Lambda mərhələsini əlavə etmək üçün boru kəmərinizi düzəldin. Fəaliyyət provayderi olaraq Lambdanı seçin, yeni yaratdığımız Lambdanı seçin və yerləşdirilmək istədiyiniz API Gateway idini daxil edin. API Gateway idarəetmə konsolunuza girsəniz, əsas səhifədə idlər sadalanmışdır.

3 - Lambda'nın doğru icazələrə sahib olduğundan əmin olun.

Sizin APIG yerləşdirmə Lambda üçün IAM roluna cəlb olunmuş APIG-lərə (yerləşdirilə bilməsi üçün) və CodePipeline-a (işi yeniləyə biləcəyi üçün) icazə daxil edilməlidir.

4 - Boru kəmərinizi sınayın

Hamısını qurduqdan sonra, Dəyişiklikləri buraxın və ya kodunuzu itələyin və boru kəməri CloudFormation yığınını və API Gateway yerləşdirilməsini yeniləmə prosesini avtomatlaşdırdığını izləyin.

Nəticə

CloudFormation'ın artıq bizim üçün bunu etməməsi biraz gülməlidir. Bəlkə də bir gün gələcək.

Yenidən hazırlamaq üçün, CloudFormation tərəfindən yerləşdirilməsini məcbur etmək üçün şablonunuzdakı APIG resurs adının yenilənməsi məsələsini qısa müzakirə etdik. APİP-inizi yenidən yerləşdirmək üçün CodePipeline və Lambda istifadə edərək prosesi necə avtomatlaşdıra biləcəyinizi də gördük.

Oxuduğunuz üçün təşəkkür edirəm və bu problemi həll etmək üçün tapdığınız yollar, yanaşmamdakı düzəlişlər və ya digər fikirlər barədə rəy bildirməkdən çekin.