-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrss.xml
7757 lines (7688 loc) · 942 KB
/
rss.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SetValue.NET]]></title><description><![CDATA[Noticias, actualizaciones y mis experiencias sobre el mundo de las soluciones cloud]]></description><link>https://www.setvalue.net</link><generator>GatsbyJS</generator><lastBuildDate>Mon, 23 May 2022 07:24:17 GMT</lastBuildDate><item><title><![CDATA[Azure Static Web Apps]]></title><description><![CDATA[Se libera por fin el nuevo servicio de Azure Static Web Apps. Hace justo un año, hablábamos de este servicio que se encontraba en preview por aquel entonces y que tenía muy buena pinta, un servicio PaaS…]]></description><link>https://www.setvalue.net/2021/06/05/</link><guid isPermaLink="false">https://www.setvalue.net/2021/06/05/</guid><category><![CDATA[Actions]]></category><category><![CDATA[AppService]]></category><category><![CDATA[Azure]]></category><category><![CDATA[DevOps]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[StaticWebApp]]></category><pubDate>Sat, 05 Jun 2021 22:00:00 GMT</pubDate><content:encoded><p>Hace justo un año, <a href="/2020/06/07/">hablábamos</a> de este servicio que se encontraba en preview por aquel entonces y que tenía muy buena pinta, un servicio <em>PaaS</em> que traía de caja mucha funcionalidad y resultaba súper práctico para escenarios con soluciones web <em>full stack</em> a Azure desde el repositorio de código.</p>
<p>Entre sus puntos clave, tenemos:</p>
<ul>
<li>Web hosting para contenido estático (HTML, JS, CSS e imágenes)</li>
<li>Tiene soporte para ampliar la funcionalidad mediante Azure Functions</li>
<li>Se conecta a un repo de GitHub o Azure DevOps y automáticamente se desencadenan las builds y los deployments.</li>
<li>Es un servicio Global</li>
<li>Ahora ya podemos confirmar que tiene certificados autorrenovables gratis</li>
<li>Se pueden utilizar custom domains</li>
<li>Un modelo de seguridad con un proxy inverso</li>
<li>Autenticación a través de AAD, GitHub y Twitter</li>
<li>Un modelo personalizable de definición de roles y asignaciones</li>
<li>Reglas de enrutado al back-end</li>
<li>Versiones de Staging con previews, desencadenadas por pull requests en el repositorio</li>
</ul>
<p>Bien, este servicio en preview era gratuito, ahora al ser GA, nos encontramos con unos planes de hosting que vienen diferenciados por dos tier de facturación, un tier gratuito pensado para proyectos personales, y otro para aplicaciones que son productivas.</p>
<p>En la siguiente tabla diferenciamos ambos tier:</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Free plan</th>
<th>Standard plan</th>
</tr>
</thead>
<tbody>
<tr>
<td>Staging environments</td>
<td>3 per app</td>
<td>10 per app</td>
</tr>
<tr>
<td>Max app size</td>
<td>250 MB per app</td>
<td>500 MB per app</td>
</tr>
<tr>
<td>Custom domains</td>
<td>2 per app</td>
<td>5 per app</td>
</tr>
<tr>
<td>APIs via Azure Functions</td>
<td>Managed</td>
<td>Managed or your own Functions app</td>
</tr>
<tr>
<td>Authentication provider integration</td>
<td>Pre-configured</td>
<td>Custom registrations</td>
</tr>
<tr>
<td>SLA</td>
<td>None</td>
<td>✔</td>
</tr>
</tbody>
</table>
<p>Sin embargo, este servicio actualmente sólo se encuentra disponible en el marketplace de estas regiones:</p>
<ul>
<li>Central US</li>
<li>East US 2</li>
<li>East Asia</li>
<li>West Europe</li>
<li>West US 2</li>
</ul>
<p>A pesar de ello, no es algo que nos deba preocupar en exceso ya que el servicio es un servicio que publica el contenido de forma global, por lo que nuestros usuarios siempre renderizarán la web desde el datacenter más cercano.</p>
<h2>Conclusiones</h2>
<p>Este servicio ha tardado un año en madurar y liberarse. Es un servicio que tenía muy buena pinta en preview, y que se ha consolidado con ciertas mejoras que lo hacen una alternativa interesante para algunos proyectos, sobre todo a nivel personal como puede ser un blog. También es útil para soluciones profesionales que puedan ser estáticas como el anuncio de un nuevo producto, una campaña de marketing que sólo expone y no requiere a penas computación, y con un coste ridículo, aproximadamente 7,59€ por aplicación al mes.</p>
<p>En definitiva, es un servicio muy interesante y que puede ser muy útil para soluciones con poca o nada carga de backend.</p></content:encoded></item><item><title><![CDATA[Azure Front Door]]></title><description><![CDATA[Utilización de Azure Front Door. Hoy me he decidido a hablar por un servicio de Azure que me gusta mucho por precio, funcionalidad y facilidad de puesta en…]]></description><link>https://www.setvalue.net/2021/03/20/</link><guid isPermaLink="false">https://www.setvalue.net/2021/03/20/</guid><category><![CDATA[ApplicationInsights]]></category><category><![CDATA[Azure]]></category><category><![CDATA[FrontDoor]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Layer-7]]></category><category><![CDATA[Security]]></category><category><![CDATA[StaticWebApp]]></category><pubDate>Sat, 20 Mar 2021 12:00:00 GMT</pubDate><content:encoded><p><a href="https://github.com/rfcm83/DemoAzureFrontDoor/"><img src="https://img.shields.io/badge/rfcm83-DemoAzureFrontDoor-%3CCOLOR%3E.svg" alt="Generic badge"></a></p>
<p>Hoy me he decidido a hablar por un servicio de Azure que me gusta mucho por precio, funcionalidad y facilidad de puesta en marcha. Se trata de Azure Front Door, un CDN moderno que es un servicio global, robusto y escalable, con aceleración dinámica y balanceo de carga, y que nos permite, entre otras cosas, añadir una capa de seguridad a nuestras aplicaciones web sin perder rendimiento.</p>
<p>Front Door es un servicio que trabaja sobre la capa 7, utilizando el protocolo <em>Anycast</em> con split TCP. Dependiendo de la ubicación del usuario, enruta las solicitudes hacia el backend que provea menor latencia, de este modo, si tenemos un servicio con múltiples localizaciones los usuarios obtendrán los contenidos desde el punto más cercano a su ubicación geográfica por lo que el rendimiento será mucho más óptimo.</p>
<p>Sus principales características:</p>
<ul>
<li>Gran performance debido al uso de <em>Anycast</em> y el split TCP</li>
<li>Monitorización inteligente de los <em>health probes</em> sobre los distintos backend</li>
<li>Enrutamiento basado en rutas URL</li>
<li>Soporte para múltiples sitios web</li>
<li>Afinidad de sesión basada en cookies</li>
<li>Gestión de certificados SSL</li>
<li>Custom domains</li>
<li>Web Application Firewall (WAF) para la seguridad de las aplicaciones</li>
<li>Redireccionamiento de tráfico HTTP a HTTPS</li>
<li>Redireccionamiento personalizado basado en path</li>
<li>Soporte de caja para IPv6 y HTTP/2</li>
<li>Caché</li>
<li>SLA del 99,99% 😎</li>
</ul>
<h2>Let's go</h2>
<p>Vamos a probar el servicio, y para ello lo primero que vamos a hacer es crear una aplicación web en React.</p>
<div class="gatsby-highlight" data-language="powershell"><pre class="language-powershell"><code class="language-powershell">gh repo create rfcm83/DemoAzureFrontDoor
cd <span class="token punctuation">.</span>\DemoAzureFrontDoor\
npx create-react-app azure-front-door
cd <span class="token punctuation">.</span>\azure-front-door\
npm <span class="token function">start</span></code></pre></div>
<blockquote>
<p>Para ejecutar estos comandos necesitas tener instalado:</p>
<ul>
<li><a href="/2020/10/24" target="_blank">GitHub CLI</a></li>
<li><a href="https://nodejs.org/en/" target="_blank">Node.js</a></li>
</ul>
</blockquote>
<p>Una vez se han completado esos comandos, se abre una sesión de navegador con la url <a href="http://localhost:3000" target="_blank"><a href="http://localhost:3000">http://localhost:3000</a></a>.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/17808ee75b85ff1076ae31d232e61bbc/29114/FrontDoor-01.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABAklEQVQoz52Sv07DMBDG8zS24ySO479JSEKQSiUKE0PVjaVvADtTZyQmdh70Qw20mChRaYdPJ9999zufdFFVN3C+GlQoMyltPYz1s3XjKlR1i7btEOWqBE004swO8SKlBiw1iFODSEgHwjVYoofklCiT35rxhPBIFA7kaNS/+skRmkNc30H0K/CiDqCBN4CPgKPJXCGrF+hfdli8vsM+PoHGxewmp4FMIr+5x3L3gdXbJ662z8OQs4GHtQhXoMJBPWxg11tw24Ew+cfz7x/uG1JZQvsOUrohatdBmmYWdhK4P6VEOGS+R97cIpEluHDnAw8N4Z3RzB3fF688vrOp2hj4BVhIWCa6dsJCAAAAAElFTkSuQmCC'); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="React App"
title="React App"
src="https://www.setvalue.net/static/17808ee75b85ff1076ae31d232e61bbc/587b0/FrontDoor-01.png"
srcset="https://www.setvalue.net/static/17808ee75b85ff1076ae31d232e61bbc/8aea6/FrontDoor-01.png 243w,
https://www.setvalue.net/static/17808ee75b85ff1076ae31d232e61bbc/44c61/FrontDoor-01.png 485w,
https://www.setvalue.net/static/17808ee75b85ff1076ae31d232e61bbc/587b0/FrontDoor-01.png 970w,
https://www.setvalue.net/static/17808ee75b85ff1076ae31d232e61bbc/5b795/FrontDoor-01.png 1455w,
https://www.setvalue.net/static/17808ee75b85ff1076ae31d232e61bbc/29114/FrontDoor-01.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Ahora hacemos un <code class="language-text">commit</code> de los cambios en el repo.</p>
<div class="gatsby-highlight" data-language="bash"><pre class="language-bash"><code class="language-bash">cd<span class="token punctuation">..</span> <span class="token comment">#Volvemos a la raíz del repo</span>
<span class="token function">git</span> commit -m <span class="token string">'First commit Demo FrontDoor'</span>
<span class="token function">git</span> push --set-upstream origin master</code></pre></div>
<p>En el Portal de Azure creamos dos <a href="/2020/06/07" target="_blank">Static Web App</a> en dos regiones distintas, en mi caso:</p>
<table>
<thead>
<tr>
<th>Setting</th>
<th>Value EUR</th>
<th>Value US</th>
</tr>
</thead>
<tbody>
<tr>
<td>Name</td>
<td>Europe</td>
<td>US</td>
</tr>
<tr>
<td>Region</td>
<td>West Europe</td>
<td>Central US</td>
</tr>
<tr>
<td>Build Presets</td>
<td>React</td>
<td>React</td>
</tr>
<tr>
<td>App Location</td>
<td>/azure-front-door</td>
<td>/azure-front-door</td>
</tr>
<tr>
<td>Output location</td>
<td>build</td>
<td>build</td>
</tr>
</tbody>
</table>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/e14e49e84f93f01bf9448a7465c3928e/29114/FrontDoor-02.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA90lEQVQoz5WR3UrEQAyF+6LuYmtX2j6H7p8P5lsIXqq47swkk98ZqReiCFo/DiE3JzkhzTCOwzRdtu1qtb5YrcdxOux329ub/W57POw/dXc8TOPQde2m7/urruva4XrTJIAQ4RRSQiq1lvoPGmZ2dzfnLMamZIKiov6DUr5NNveGmeZOjTNVL7OsFP87gZk1AQhJxQp7Ea+zSvUFmZm5CSDIFoHfThADxUApirIvMmfEWouJQgDNYqRzFVtkPodIPIOQCSkjZSDTZWYRqbUK6/PTa4qQgTDlpZsR88cjLGNWUdNZbstuvn9MDy+oTIhoZv4rZkZfeAe7J2oHzNulXwAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Sample Static Web App"
title="Sample Static Web App"
src="https://www.setvalue.net/static/e14e49e84f93f01bf9448a7465c3928e/587b0/FrontDoor-02.png"
srcset="https://www.setvalue.net/static/e14e49e84f93f01bf9448a7465c3928e/8aea6/FrontDoor-02.png 243w,
https://www.setvalue.net/static/e14e49e84f93f01bf9448a7465c3928e/44c61/FrontDoor-02.png 485w,
https://www.setvalue.net/static/e14e49e84f93f01bf9448a7465c3928e/587b0/FrontDoor-02.png 970w,
https://www.setvalue.net/static/e14e49e84f93f01bf9448a7465c3928e/5b795/FrontDoor-02.png 1455w,
https://www.setvalue.net/static/e14e49e84f93f01bf9448a7465c3928e/29114/FrontDoor-02.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Cuando ya se han desplegado las dos app, creamos un Front Door desde el Portal en West Europe, para ello, introducimos la siguiente configuración de base:</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/5156acdf7ecedd0769065bc66c071122/29114/FrontDoor-03.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABKklEQVQoz5WRy07DQAxF86VtKtqG8PgM6IsPY9sF3bBA6gaiPpLM2x7bQWnVKqiqgKPRjBe+vteaJM/vsjzvp2k6GAzS/uPD/Xw2nTw/zaaTxXx2Pi+L+W2Wpb3eeDjMxqPR8CbPxokPQVsXiZrfKMvya7NVxgKg8yESJZUyxb4ulSmVrm3QAX0ICEAd+HDvaqM8mkA6ROWjcpC87/1yE1YVryp+K2m5p0KDVrW11p3w3iPCrqwqZZ33DhAxts4iIk0DiC4AcVtT+0g3sIgwUbGr1hslTPEYRyQ59jG30c71pZiIlDaVNh4AYwszH5zlaN/IdRqR2oZCQ9t2Gpo0f+Ns0OUf4ottmuRi3FV5J+9J/Lo2H1sH4fAlEC1EjMQ/EWaMtPx0Drm78zd/nmdhv+ngggAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Add Frontend"
title="Add Frontend"
src="https://www.setvalue.net/static/5156acdf7ecedd0769065bc66c071122/587b0/FrontDoor-03.png"
srcset="https://www.setvalue.net/static/5156acdf7ecedd0769065bc66c071122/8aea6/FrontDoor-03.png 243w,
https://www.setvalue.net/static/5156acdf7ecedd0769065bc66c071122/44c61/FrontDoor-03.png 485w,
https://www.setvalue.net/static/5156acdf7ecedd0769065bc66c071122/587b0/FrontDoor-03.png 970w,
https://www.setvalue.net/static/5156acdf7ecedd0769065bc66c071122/5b795/FrontDoor-03.png 1455w,
https://www.setvalue.net/static/5156acdf7ecedd0769065bc66c071122/29114/FrontDoor-03.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Después, agregamos un backend pool que apuntará a Europa y América.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/220bd7ff3613759922b94f4a43e36cfd/29114/FrontDoor-04.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABVUlEQVQoz42PzW4TQRCE90VDbJk4sYHHIIkdHowD4kRyRQJEjH/WuzOz3T39N2icBBkJCX+qS6tU3V3NbD6/ms3PR+PReDwenb97+2a5uL25fr+4vblbLv7ow91ydjkdvTqbvp5cTi8uJpP51bQBojiAqJb/0fVh3fYDkqixKqs2XUzrfb8PaR9iP1AiRiImVjn4TxJlkU0XA2nKGlAiaRuG5mGDn3/hQ6f3rX5p5b63NnH6EeiR8irnVeZVTo8IkEOMhFRKcffiDgCNulspfiRVc3MRQUAEZBY3V9UQUwKgXGERJGrqmr8xM3OvNlKtwPwcDn09nnPNMwNiDf+T43V1NotpgCzlxSWippyKr/fhZ4duKqJmVjufGnUPIUjOpmqqbpYPnU9Mlxi6zXa72bW7tt3udiGm5uO39HULmQAAMMuQhQ9fHeNmLPrpe4zI9W19wn4DHIJktAoFFRgAAAAASUVORK5CYII='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Add Backend Pool"
title="Add Backend Pool"
src="https://www.setvalue.net/static/220bd7ff3613759922b94f4a43e36cfd/587b0/FrontDoor-04.png"
srcset="https://www.setvalue.net/static/220bd7ff3613759922b94f4a43e36cfd/8aea6/FrontDoor-04.png 243w,
https://www.setvalue.net/static/220bd7ff3613759922b94f4a43e36cfd/44c61/FrontDoor-04.png 485w,
https://www.setvalue.net/static/220bd7ff3613759922b94f4a43e36cfd/587b0/FrontDoor-04.png 970w,
https://www.setvalue.net/static/220bd7ff3613759922b94f4a43e36cfd/5b795/FrontDoor-04.png 1455w,
https://www.setvalue.net/static/220bd7ff3613759922b94f4a43e36cfd/29114/FrontDoor-04.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Añadimos el FQDN de Europa.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/32a43fba6b5270a80cc1ec3a7c392cde/29114/FrontDoor-05.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABOUlEQVQoz42Q2U7DMBRE/aVdgLaU5TNYWvgwnpCQgFckhNQCJbET+9q+W1ACRS0IwdH4cWY810wPDif7016vPxzuDAf946PD+ez87PRkdn52MZ996fJivj8eD/q9yXg0Hu3t7e5OJyMDKdUBmLn5Cw9g6yAiqto+VWNr/1K6svJlVbuQfMKYEiZkYsa1iJl5VRRvRelcZa0tXRViMvev8fo53lu+K/i2oDsnhUf/VKVFysuclxmX2S9igFyUhXMuxkjUhREZVpWm0Q0xi4oSUYQYISKSijKztdY5ByEgInUYVf22TbpZSBRjaicgqrZmAGAi6To/ZPQXNuPaC4kE7wmR1rVtc/NftKzDc5W7qE/+bVZlEZKtH5kfk391d9rCXD36hxXkBAAQM4VMSCzbqAgS3ywAUJqNjHeEoGZ+1IyAfwAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Add Europe Backend"
title="Add Europe Backend"
src="https://www.setvalue.net/static/32a43fba6b5270a80cc1ec3a7c392cde/587b0/FrontDoor-05.png"
srcset="https://www.setvalue.net/static/32a43fba6b5270a80cc1ec3a7c392cde/8aea6/FrontDoor-05.png 243w,
https://www.setvalue.net/static/32a43fba6b5270a80cc1ec3a7c392cde/44c61/FrontDoor-05.png 485w,
https://www.setvalue.net/static/32a43fba6b5270a80cc1ec3a7c392cde/587b0/FrontDoor-05.png 970w,
https://www.setvalue.net/static/32a43fba6b5270a80cc1ec3a7c392cde/5b795/FrontDoor-05.png 1455w,
https://www.setvalue.net/static/32a43fba6b5270a80cc1ec3a7c392cde/29114/FrontDoor-05.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Seguimos con el de Estados Unidos.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/d76b83687876f90206e0fc10e34ee33e/29114/FrontDoor-06.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABNklEQVQoz42QyU7DMBRF/aUdgLaU4TMYWvgwVkhIwBYJIbVASezEfrbfFJRAUQtCcHS8vNe+NtODw8n+tNfrD4c7w0H/+OhwPjs/Oz2ZnZ9dzGdfXl7M98fjQb83GY/Go7293d3pZGQgpToAMzd/4QFsHUREVdujamztX0pXVr6saheSTxhTwoRMzLiWmJlXRfFWlM5V1trSVSEmc/8ar5/jveW7gm8LunNSePRPVVqkvMx5mXGZ/SIGyGVROOdijPwBkWFVaRrdkFlUlIgixAgRkVSUma21zlqAQITUYVT12zbpZiFRjKmdgKjahgGAiaS780Ojv7BZ1/6QSPCeEFvXmOa/aFmH5yp3VZ/8O6zKIiRbLzI/Jv+a7tzCXD36hxXkBAAQM4VMSCzbqAgS3ywAUJqNjneLKWaC2CdPkQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Add US Backend"
title="Add US Backend"
src="https://www.setvalue.net/static/d76b83687876f90206e0fc10e34ee33e/587b0/FrontDoor-06.png"
srcset="https://www.setvalue.net/static/d76b83687876f90206e0fc10e34ee33e/8aea6/FrontDoor-06.png 243w,
https://www.setvalue.net/static/d76b83687876f90206e0fc10e34ee33e/44c61/FrontDoor-06.png 485w,
https://www.setvalue.net/static/d76b83687876f90206e0fc10e34ee33e/587b0/FrontDoor-06.png 970w,
https://www.setvalue.net/static/d76b83687876f90206e0fc10e34ee33e/5b795/FrontDoor-06.png 1455w,
https://www.setvalue.net/static/d76b83687876f90206e0fc10e34ee33e/29114/FrontDoor-06.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Dejamos los valores de balanceo por defecto, y añadimos el backend pool. A continuación, necesitamos crear dos reglas de enrutamiento, la primera para que todo el tráfico HTTP se redirija automáticamente a HTTPS, y la otra para que el tráfico HTTPS sea direccionado al backend pool que hemos creado.</p>
<p>Para hacer el redirect de HTTP a HTTPS, necesitamos modificar estos valores:</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/ef97fc34d16a2d00b95ec43fab3c3588/29114/FrontDoor-07.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABPElEQVQoz42QSU4DQQxF66SBDHTCdAzIxIk4AStWJGIFEiyaIUl312C7q1wulA5EEITI019YLn35/1LHJydHWb/VOmi3O+3Dg/Oz08l4NLy8GI+G08l4q6vpZNDPup32oJ9lR71et3s8yBQSWQfMnP6j0toCRhb+QpXGvhVVoW2hTeXIkiciT55D5MBbhRBWiwIMevQefaDgjFPzd7x9xXnJsxXfrcKsikvj9bPGnKhRnZPNqXTVqlwQkEhkjhIFABSLxJTkmzZv31cS11ErrbUxgAgIQGQcKBHZ6RZj3FmKrM3GGtxCZGxj3o9YalsaQEIAQETrnEp7ky+KvIRNtJQSIu5rFhGtNQcvzZxSquta/ar8Jw8vhXGYmk/c3Fc3T/ZxATXBukkdXB184PgTiTEwX98vC1c3KT6zfACyRWWIfJTQkQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Redirect HTTP - HTTPS"
title="Redirect HTTP - HTTPS"
src="https://www.setvalue.net/static/ef97fc34d16a2d00b95ec43fab3c3588/587b0/FrontDoor-07.png"
srcset="https://www.setvalue.net/static/ef97fc34d16a2d00b95ec43fab3c3588/8aea6/FrontDoor-07.png 243w,
https://www.setvalue.net/static/ef97fc34d16a2d00b95ec43fab3c3588/44c61/FrontDoor-07.png 485w,
https://www.setvalue.net/static/ef97fc34d16a2d00b95ec43fab3c3588/587b0/FrontDoor-07.png 970w,
https://www.setvalue.net/static/ef97fc34d16a2d00b95ec43fab3c3588/5b795/FrontDoor-07.png 1455w,
https://www.setvalue.net/static/ef97fc34d16a2d00b95ec43fab3c3588/29114/FrontDoor-07.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>A continuación, creamos el forwarding de HTTPS hacia el backend.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/5126c6de145822b2dcb54bc458cd1c95/29114/FrontDoor-08.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABOklEQVQoz42Qy05CMRCG+6Qot8NFfQzl5mO5cOVKXBlNxISowDmnl5k57XRqAEWCMfLlTxfTfM38Vb1+v511arWTer1RPz25OD8bj4aDq8vRcDAZj3a5noy7nazZqHc7WdZutZrNXjdTSGQdMHP6D621BYws/I0qjH3Py1zbXJvSkSVPRJ48h8iBf8JhtcitBo/eow8UnHHq4QPv3vCh4OmK71dhWsal8XqmcU60STUnO6fClct8QUAikTlKFABQLBJTkr1s7/ZHEiVwKLXWxgAiIACRcaBE5KBbjPFgKLLuaa3FHUTGbuSjiHFRWAuAiLA5rXMqHYnI4zx3SNvVUkqIqI52RRvDwcv6C9YyEalflf/UV0U5y2H7UErJe69uX+zzAiqCdZMquCr4wPEXzHzzlL8W1Ub+2uUTq65lfhJd8M0AAAAASUVORK5CYII='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Forwarding Backend"
title="Forwarding Backend"
src="https://www.setvalue.net/static/5126c6de145822b2dcb54bc458cd1c95/587b0/FrontDoor-08.png"
srcset="https://www.setvalue.net/static/5126c6de145822b2dcb54bc458cd1c95/8aea6/FrontDoor-08.png 243w,
https://www.setvalue.net/static/5126c6de145822b2dcb54bc458cd1c95/44c61/FrontDoor-08.png 485w,
https://www.setvalue.net/static/5126c6de145822b2dcb54bc458cd1c95/587b0/FrontDoor-08.png 970w,
https://www.setvalue.net/static/5126c6de145822b2dcb54bc458cd1c95/5b795/FrontDoor-08.png 1455w,
https://www.setvalue.net/static/5126c6de145822b2dcb54bc458cd1c95/29114/FrontDoor-08.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Una vez añadidas las reglas de enrutamiento, revisamos y creamos el Front Door. Aunque estamos haciendo este proceso en la creación del recurso, luego, desde el portal podremos actualizar y agregar o eliminar reglas o backends. Tras unos minutos, el servicio estará desplegado y configurado, pero es preciso esperar un poco para que esté completamente configurado, todos los cambios sobre los Front Door tardan unos minutos en materializarse.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/050c09e03dda1fd709c5f31dfbac7360/29114/FrontDoor-09.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABEklEQVQoz51SyU7DMBTM12Szs3h5Tpw0EWpBFUJIHBCcQfwA4gO4II5IXDnyo4OcbqF1RMthZNkznnm2JmjaGchY1LZFVTcQUh9AUQVNlZdz0MbCNh26rkdQqBohU0hzQpIRIqYmoKc5rhFzjYRrBHlpEKY7Ml6TW7jzRCCMCj/PfwcFuTDDhDuBWmMljDMCtwuUFzeIc4MoldugsXYDj+EoOSnB7RxnL284f/0E3T4gYtKrPdJQoJhfY/n+hcuPb7SPz0PIyYabv3JrmAiIq3vQ3ROYXQz7seboCd0FXtZQpoc0PYRqIHWLkmaTZn8auhqx3CCjHkW3BBN2qNfJhuMnr3pGiEYd/feT93vm4/YNfwCvc1g+MO++HgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Front Door Up"
title="Front Door Up"
src="https://www.setvalue.net/static/050c09e03dda1fd709c5f31dfbac7360/587b0/FrontDoor-09.png"
srcset="https://www.setvalue.net/static/050c09e03dda1fd709c5f31dfbac7360/8aea6/FrontDoor-09.png 243w,
https://www.setvalue.net/static/050c09e03dda1fd709c5f31dfbac7360/44c61/FrontDoor-09.png 485w,
https://www.setvalue.net/static/050c09e03dda1fd709c5f31dfbac7360/587b0/FrontDoor-09.png 970w,
https://www.setvalue.net/static/050c09e03dda1fd709c5f31dfbac7360/5b795/FrontDoor-09.png 1455w,
https://www.setvalue.net/static/050c09e03dda1fd709c5f31dfbac7360/29114/FrontDoor-09.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Bien, ya tenemos el servicio arriba, si lo testamos entrando por la ruta HTTP redirige automáticamente al HTTPS, pero... necesitamos una url más amigable, para ello vamos a crear un <em>custom domain</em>.</p>
<p>En el Portal de Azure, accedemos al <em>blade</em> del <strong>Front Door Designer</strong>, y creamos un nuevo frontend, y para asegurarnos que nuestro sitio es seguro utilizaremos un certificado SSL, para ello habilitamos el <em>Custom Domain HTTPS</em> y le indicamos que lo gestione el Front Door.</p>
<blockquote>
<p><strong>Nota</strong>: Para poder asignar un custom domain es preciso asignar un registro CNAME que apunte al FQDN del Azure Front Door.</p>
</blockquote>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/698eadc7dc2631e7754da8478c3a7722/29114/FrontDoor-10.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWElEQVQoz4WQW08CMRCF+0dlNdwE1H/hDfxtPpHom0QjILfdttPbzLRrdolkIVFPzkubOT1fRwyGo8FwdNbKWll2cXF+c301GT/c390+PtxPxo8HP03Gg37/PMu6nXa/1+t22sPLnthpDcaCdda5slIqf5FUcrPbSqWc88Z5JBbKuBQ5lqUKrDxLz4UjGTgEQhPQ4sHz+XL1tTLGggbQxhorlAbCYJGfl3a641eZXmSaFnFbeHhXfuH9woeFh6VTUhsADIgBQ0AmFuvNNs9zZjoBTumU/+2rkBqQqqQPgTgKqL+aUor1+N4xpRhjeTjX/ljL2Vo3tyKU0dVcFU/NWmY+AimTNqCUciEgUYxVlwBr94gn4frFo/hyk89WEhGRmOq82BWF/SH/M1zmSoNxRIRIiFiFiYhqwn+bAcwiN4j1rvbYqVaMkbm6aoqZ/Y+c88+fVvrYXNg334Bk3BxaJ8MAAAAASUVORK5CYII='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Custom Domain"
title="Custom Domain"
src="https://www.setvalue.net/static/698eadc7dc2631e7754da8478c3a7722/587b0/FrontDoor-10.png"
srcset="https://www.setvalue.net/static/698eadc7dc2631e7754da8478c3a7722/8aea6/FrontDoor-10.png 243w,
https://www.setvalue.net/static/698eadc7dc2631e7754da8478c3a7722/44c61/FrontDoor-10.png 485w,
https://www.setvalue.net/static/698eadc7dc2631e7754da8478c3a7722/587b0/FrontDoor-10.png 970w,
https://www.setvalue.net/static/698eadc7dc2631e7754da8478c3a7722/5b795/FrontDoor-10.png 1455w,
https://www.setvalue.net/static/698eadc7dc2631e7754da8478c3a7722/29114/FrontDoor-10.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Cuando lo hemos creado, el propio diseñador nos advierte de que no está funcionando, así que necesitamos activarlo en las reglas de enrutamiento. Accedemos a cada regla de enrutamiento y lo añadimos.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/a38967fa859613bdbb82d90991e401f2/29114/FrontDoor-11.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABc0lEQVQoz4WR0W6TMQyF86KshbUdpSCeAjY63osr7pAYF3CziZVtbfI7sRMntjPxF1Y0CTj6buLkHEe2W65WyxerJ0eTyXT67On09auX5+uz07dv1men79fvDpyvn58sppOj+Wy2mM9nx8fLk4XbxZiQImWfchMTtf4XxQi7MBQuqtpaE2kOMJtKU9sBeUgBcEg5UUmZU65YHuCrW0+FRaS2JipE5CBGrtWkUfQAIcYAEFIcmGLDaIX2KOfrLVAu3UxFu/VM5G7utkPwidvHTf7k9Qv0C+ifwXzgdBXLpvzkusCP8vXyxm8DZ66l1tIwoks5997VDFmKmFpX66ImY/wDpnYXYABIiAkRiYZEDjCqau9mdhiVmY3F/mcFkWqtzLUwc62I5BJRH32PzCLyyOzD4EPIORNRzjkmdLsQaPz5vzv3bptt+B7o18sx3bVxZf81m1mEwMw6Xu1X7WyUiIwhB+2P5be4lA/f/O2AfZzgPu4e74pjEWc+wj8AAAAASUVORK5CYII='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Add frontend to routing rule"
title="Add frontend to routing rule"
src="https://www.setvalue.net/static/a38967fa859613bdbb82d90991e401f2/587b0/FrontDoor-11.png"
srcset="https://www.setvalue.net/static/a38967fa859613bdbb82d90991e401f2/8aea6/FrontDoor-11.png 243w,
https://www.setvalue.net/static/a38967fa859613bdbb82d90991e401f2/44c61/FrontDoor-11.png 485w,
https://www.setvalue.net/static/a38967fa859613bdbb82d90991e401f2/587b0/FrontDoor-11.png 970w,
https://www.setvalue.net/static/a38967fa859613bdbb82d90991e401f2/5b795/FrontDoor-11.png 1455w,
https://www.setvalue.net/static/a38967fa859613bdbb82d90991e401f2/29114/FrontDoor-11.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Una vez se han modificado las dos reglas, pulsamos en Guardar, este proceso tardará algo más de lo habitual porque no sólo va a actualizar la configuración del Front Door, también tiene que generar el certificado digital del <em>custom domain</em> que hemos agregado, el propio portal nos indica que podría llegar a tardar unos 20 minutos. Si se accede a la configuración de este nuevo frontend, se puede ver cómo está avanzando el proceso. Cuando finalice, podremos volver a testar la configuración del Front Door por HTTP y HTTPS, el resultado deberá ser el mismo que antes de agregar nuestro dominio.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/1c5d1de5be77da9101554d6aef1c197b/29114/FrontDoor-12.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABVklEQVQoz52Sz06DQBDGeRiF8qfAwrItLVCK0K2tpjWxIVarR08efQC9eNf4DD7mZ9i2S0OoUQ9fsruz85v5JqOE4RB5UYBPOfI8RxRFcAmF51GQnfygBxr05L0pykKEgxhxkkKxXIaCz7C+XaMsS5zlHCc6gWb6DdGWt50sio5FoXcDKEbXF5DV6hpTzjFKM6iGLz5sFUDTCdSOK5Lr91qHcAHk0wvcb+6wWF4hyzlUw5OfVc2BHXM42SV0EkLbxwR8rxqumDbFMMmwWC4xPZ8hTjIJrCqavRTj5zcULx+gy43otq1LCbRdJhL1g9alFZ3AGc8xef3E/P0L4cOTLHQcSJiYWT34OqGyp3UDkHkJdvMIg6U41ZwfoVtgS7BKsNw+/F4C4g/gBZE4uzT6RYdHgNUamDZDl43gRBOYbh+Gzf4OlJblngXC+uGM/2W5uWdtsSbwGwM2XioFtEygAAAAAElFTkSuQmCC'); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Custom Domain running"
title="Custom Domain running"
src="https://www.setvalue.net/static/1c5d1de5be77da9101554d6aef1c197b/587b0/FrontDoor-12.png"
srcset="https://www.setvalue.net/static/1c5d1de5be77da9101554d6aef1c197b/8aea6/FrontDoor-12.png 243w,
https://www.setvalue.net/static/1c5d1de5be77da9101554d6aef1c197b/44c61/FrontDoor-12.png 485w,
https://www.setvalue.net/static/1c5d1de5be77da9101554d6aef1c197b/587b0/FrontDoor-12.png 970w,
https://www.setvalue.net/static/1c5d1de5be77da9101554d6aef1c197b/5b795/FrontDoor-12.png 1455w,
https://www.setvalue.net/static/1c5d1de5be77da9101554d6aef1c197b/29114/FrontDoor-12.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<h2>Probando la configuración global</h2>
<p>Decíamos que este servicio balancea el tráfico al backend más próximo para así optimizar el performance de nuestro site. Bien, pues vamos a probar que es así, para ello creamos un nuevo Application Insights, con la configuración de servicio clásico, en nuestro grupo de recursos y creamos un test de disponibilidad desde el <em>blade</em> <strong>Availability</strong>.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/b3224371994eea3a9ed11a9fa93d0cee/29114/FrontDoor-13.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABb0lEQVQoz4WS624TMRCF90GhyqVJKirgLVCapA/HC/ALVNp017exvXM12mx/REWCT0ejkWWf0dG4+3R/v93tPny8WSwXq+Xi65fPx+PDfv/teNg/ng6n48Osx9PhbrddLRe77WZzu16vV3e7TdfH5EOIKTuXckEmUWsTc72iABDi9UmXoJgphHz+2fe/Qzgn9xL9SwxngKEWN7rXAn0trvQu1crKKiTCKqxdgoyIKaU6Vmt6bWzTdPsVxyosmIOPkAqNxMizuhCjiEDOTGSqJqIXmaiJTo1pMyPiwacMMF2z2bZ1/eDGWkOIA4yZBViAGIjnPrMk4oQyDH4IkYgmO1XVybjzMYyI3vsfT0MkSaxzTaS+0isUV/A5kZoBQEyJmVXf0nVQcmsNxzLEGLBFtFkB1VdxhV2VImZmhKSqduHtcaxja1PS9k/MTO399jqotbUmIu0/2N+r71LOpjYneYeI4IURkRC/P1VAvf4+fwC1fmSrsYYpCwAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Availability Test"
title="Availability Test"
src="https://www.setvalue.net/static/b3224371994eea3a9ed11a9fa93d0cee/587b0/FrontDoor-13.png"
srcset="https://www.setvalue.net/static/b3224371994eea3a9ed11a9fa93d0cee/8aea6/FrontDoor-13.png 243w,
https://www.setvalue.net/static/b3224371994eea3a9ed11a9fa93d0cee/44c61/FrontDoor-13.png 485w,
https://www.setvalue.net/static/b3224371994eea3a9ed11a9fa93d0cee/587b0/FrontDoor-13.png 970w,
https://www.setvalue.net/static/b3224371994eea3a9ed11a9fa93d0cee/5b795/FrontDoor-13.png 1455w,
https://www.setvalue.net/static/b3224371994eea3a9ed11a9fa93d0cee/29114/FrontDoor-13.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Mantenemos las cinco localizaciones que nos propone, en mi caso son:</p>
<ul>
<li>West US</li>
<li>UK West</li>
<li>Japan East</li>
<li>France Central</li>
<li>Australia East</li>
</ul>
<p>Si recordamos, nuestra app está publicada en West Europe y Central US, por lo que todos estos orígenes están próximos, pero no coincide ninguno con nuestra publicación. Aunque realmente este test está haciendo un ping, ya podemos ver cómo las localizaciones más lejanas tienen de media, peores tiempos de respuesta que las localizaciones más próximas a los datacenter de nuestros backend.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/4a0b0686f6edd84859eee2cba0763fca/29114/FrontDoor-14.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABc0lEQVQoz32R624aQQxG90lLipY0gV7eoiJAXq7qA7RSAJFddq6eGc/YnmqzpSIS6tGR5T/f2NY0y9Xq4XH5YTab3d3NP86+ff2y3T6t19+3m/XzbrPbPk0+7zafV8u2nX+6X9wv2radPz4smrN1ShvrYFAuBCyZWOrIVK/hd0qRxvkgwt5A93Luj9p0Tr1a/WpN5/0Qg0qqD2MzhKgzmoymTPo+Ns4DIjrnYoosfD1JxvfzQUPMmdDngqlikjTJQo2xloi89yVnYRYiviijpQpXYUikwe3hZR/2+7A/hANSbs6DSjEaYxUkKDTpS/nbE/tMgOXHMfz83VHC69UabU1CNFr/Ommb2ZO4wr6MVcfcO9ARTy6zyNsh8s8x7APUWhHj8dwNoVgUi+yyqJBPyp2U6x1a5HqLxsZURVhEeRUAaDxSahUqBQLEEKiUaeyNsI9x/EJmSEBEcoGIUkqImfn22DHsAISllMJviAhfICL8L38AVH9i+D+xbwoAAAAASUVORK5CYII='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Results Test"
title="Results Test"
src="https://www.setvalue.net/static/4a0b0686f6edd84859eee2cba0763fca/587b0/FrontDoor-14.png"
srcset="https://www.setvalue.net/static/4a0b0686f6edd84859eee2cba0763fca/8aea6/FrontDoor-14.png 243w,
https://www.setvalue.net/static/4a0b0686f6edd84859eee2cba0763fca/44c61/FrontDoor-14.png 485w,
https://www.setvalue.net/static/4a0b0686f6edd84859eee2cba0763fca/587b0/FrontDoor-14.png 970w,
https://www.setvalue.net/static/4a0b0686f6edd84859eee2cba0763fca/5b795/FrontDoor-14.png 1455w,
https://www.setvalue.net/static/4a0b0686f6edd84859eee2cba0763fca/29114/FrontDoor-14.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Para completar la prueba, agregamos Central US y West Europe al test, y comparamos resultados.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/0c9fe7d3cf7bb091696e53a9e2e5ff19/29114/FrontDoor-15.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABVklEQVQoz4VR606UQQydN2XdC+sKPAbCfvBivoC/TEzUH2JY1jDX9vRiZj4RJRpPmk7SnJ52TsPu7Px0+/pksVgul68WJxcX59P++urt5XR9dTvtb6b97Rw309mb3Wq13G42p+v1erXcbTfh8JiIoe4Zbv4/WOeou5qJeYgx5Vwa9N3H7+8/fLn7+u1w/3A8HGJMMeVUSmutNmJmVRVRQABhAKqhEQFw01r40+e748MxxVhyBtAZgP0NPnJIKdXWzKxTRX2UfX7+DR0IOaUYo7vTWMFU/xzhLytmKsIDIcaYc34eBfbft1N1sINfKLq7iIQyLHF3HRMIXfantyoGqLnKkBhf7SHdIwBh7vnVzNDSUAuBmIkrS2WtsEpSG89RCKJGROH5hGb9EiwMKw25yWMFsTILs7anqCTEndnX1icwA8OG2RQfng5F6VaAiRpTR8+t1Vp/AApMZ70DDtxlAAAAAElFTkSuQmCC'); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Final Comparison"
title="Final Comparison"
src="https://www.setvalue.net/static/0c9fe7d3cf7bb091696e53a9e2e5ff19/587b0/FrontDoor-15.png"
srcset="https://www.setvalue.net/static/0c9fe7d3cf7bb091696e53a9e2e5ff19/8aea6/FrontDoor-15.png 243w,
https://www.setvalue.net/static/0c9fe7d3cf7bb091696e53a9e2e5ff19/44c61/FrontDoor-15.png 485w,
https://www.setvalue.net/static/0c9fe7d3cf7bb091696e53a9e2e5ff19/587b0/FrontDoor-15.png 970w,
https://www.setvalue.net/static/0c9fe7d3cf7bb091696e53a9e2e5ff19/5b795/FrontDoor-15.png 1455w,
https://www.setvalue.net/static/0c9fe7d3cf7bb091696e53a9e2e5ff19/29114/FrontDoor-15.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Finalmente, si analizamos los resultados, los tiempos de las regiones europeas y americanas tienen mejores tiempos de respuesta que las que están en Australia o Asia, tanto en el promedio como en los valores mínimo y máximo, y, por supuesto, Central US y West Europe tienen unos valores medios mejores que el resto de su región.</p></content:encoded></item><item><title><![CDATA[Resumen de las características de seguridad publicadas en 2020 en GitHub]]></title><description><![CDATA[Breve resumen con lo mejor de las novedades de seguridad incluidas en GitHub durante el año 2020. Entre las muchas novedades que se han incluido en GitHub durante el 2020, encontramos un importante conjunto de nuevas características o…]]></description><link>https://www.setvalue.net/2021/01/31/</link><guid isPermaLink="false">https://www.setvalue.net/2021/01/31/</guid><category><![CDATA[GitHub]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Security]]></category><category><![CDATA[Summary]]></category><category><![CDATA[Highlights]]></category><pubDate>Sun, 31 Jan 2021 11:45:00 GMT</pubDate><content:encoded><p>Entre las muchas novedades que se han incluido en GitHub durante el 2020, encontramos un importante conjunto de nuevas características o funcionalidades enmarcadas en el apartado de seguridad. Algunas de estas novedades las hemos ido comentando a lo largo del año pasado, no obstante, vamos a realizar un pequeño resumen.</p>
<h2>Let's go</h2>
<p>Durante este pasado 2020 se han publicado las siguientes novedades en el apartado de seguridad:</p>
<ul>
<li>Code Scanning with CodeQL</li>
<li>Escaneado de tokens en repositorios privados y ficheros zip</li>
<li>Mantenimiento de dependencias actualizadas y seguras con Dependabot</li>
<li>Revisiones de seguridad que ayudan a prevenir la inclusión de dependencias con vulnerabilidades</li>
<li>GitHub Advisory Database incluye todas las advertencias de npm</li>
</ul>
<h3>Code Scanning with CodeQL</h3>
<p>Code scanning es una característica que se puede habilitar en los repositorios públicos, que permite encontrar, clasificar y priorizar los fixes que se deben realizar sobre los problemas existentes en el código. Esto ayudará a que el código vaya mejorando y que puedan evitarse los mismos errores en el futuro.</p>
<p>El escaneo se puede desencadenar de forma periódica o a partir de cambios realizados en el repo con nuevos <code class="language-text">push</code> o con la aceptación de <code class="language-text">pull requests</code>, todo ello gracias a las <a href="/2020/08/01">GitHub Actions</a>.</p>
<p>Más información acerca de cómo activarlo y ampliando información en este otro <a href="/2020/10/19">post</a>.</p>
<h3>Escaneado proactivo de secretos</h3>
<p>Cuando los desarrollos utilizan servicios externos a la solución, se suele necesitar claves o tokens que permiten la autenticación con el servicio. Si estas claves son almacenadas en el repositorio, las personas que tienen acceso al repo pueden emplear estos secretos con los mismos privilegios que el propietario. Para evitar un problema que pueda suponer un mal uso de alguno de los servicios que utilizamos, lo mejor es siempre almacenar este tipo de secretos fuera del repositorio.</p>
<p>Si alguien realiza un <code class="language-text">commit</code> de un secreto en un repositorio público o privado de organización con <em>Advanced Security</em>, Secret Scanning lo detecta y notifica a los administradores de que se ha incluido un secreto, para poder mitigar un potencial problema rápidamente. En paralelo, en los repositorios públicos, GitHub notifica al proveedor de servicios que ha emitido este secreto, éste valida las credenciales y decide si revoca, emite un nuevo secreto o se comunica con el propietario de las credenciales directamente. Esto dependerá de los riesgos asociados para el suscriptor o para el propio servicio.</p>
<p>Si un repositorio pasa de privado a público, también se desencadena automáticamente para evitar que se produzca ningún tipo de problema de seguridad con un uso indebido de credenciales.</p>
<p>Actualmente, se analizan tokens de los siguientes servicios:</p>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>Adafruit IO</td>
<td>Alibaba Cloud</td>
<td>Amazon Web Services</td>
</tr>
<tr>
<td>Atlassian</td>
<td>Azure</td>
<td>Clojars</td>
</tr>
<tr>
<td>CloudBees CodeShip</td>
<td>Databricks</td>
<td>Datadog (public repos)</td>
</tr>
<tr>
<td>Discord</td>
<td>Doppler</td>
<td>Dropbox</td>
</tr>
<tr>
<td>Dynatrace</td>
<td>Finicity</td>
<td>Frame.io</td>
</tr>
<tr>
<td>GitHub</td>
<td>GoCardless</td>
<td>Google Cloud</td>
</tr>
<tr>
<td>Hashicorp Terraform</td>
<td>Hubspot</td>
<td>Mailchimp</td>
</tr>
<tr>
<td>Mailgun</td>
<td>MessageBird (public repos)</td>
<td>npm</td>
</tr>
<tr>
<td>NuGet</td>
<td>Palantir</td>
<td>Plivo</td>
</tr>
<tr>
<td>Postman</td>
<td>Proctorio</td>
<td>Pulumi</td>
</tr>
<tr>
<td>Samsara</td>
<td>Shopify</td>
<td>Slack</td>
</tr>
<tr>
<td>SSLMate</td>
<td>Stripe</td>
<td>Tecent Cloud</td>
</tr>
<tr>
<td>Twilio</td>
<td>JSON Web Token (private repos)</td>
<td>OAuth Client Credential (private repos)</td>
</tr>
</tbody>
</table>
<h3>Dependabot version updates</h3>
<p><em>Dependabot</em> mantiene el repositorio actualizado de forma automática con las últimas versiones de paquetes y aplicaciones que se referencian en él. Apoyándose en los manifiestos o los ficheros de configuración de la solución, <em>Dependabot</em> utiliza esta información para localizar los elementos desactualizados, y determinar si hay una versión nueva que debe actualizarse.</p>
<p><em>Dependabot</em> determina si hay una nueva versión de una dependencia observando el control de versiones semántico (<em>semver</em>) de la dependencia para decidir si debe actualizarse a esa versión. Cuando decide actualizar, realiza un <code class="language-text">pull request</code> con las modificaciones y cambios pertinentes en el manifiesto, después se deberá comprobar que las pruebas pasan, revisar el changelog y las notas de la versión incluidas antes de completar el <code class="language-text">merge</code>.</p>
<p>Si se habilitan las actualizaciones de seguridad, se generarán <code class="language-text">pull request</code> para actualizar vulnerabilidades en los paquetes.</p>
<h3>Dependency Graph: Dependency Review</h3>
<p>Cuando se produce un <code class="language-text">pull request</code> en la rama principal del repo y contiene cambios en los paquetes del manifiesto, se puede realizar un <em>Dependency Review</em> para ver qué ha cambiado o si hay alguna dependencia indirecta. También incluye información acerca de si algo de lo que se ha añadido o modificado incluye vulnerabilidades conocidas.</p>
<p><em>Dependency review</em> está disponible para repositorios públicos, o para privados en organizaciones con licencia <em>Advanced Security</em>, y soporta los mismos lenguajes del ecosistema de <em>Dependency Graph</em>.</p>
<h3>GitHub Advisory Database</h3>
<p>Esta base de datos contiene una lista de vulnerabilidades de seguridad, tanto de las personas que mantienen los distintos paquetes como de terceros como la <em>National Vulnerability Database</em>.</p>
<p>Con esta nueva funcionalidad, como propietario o usuario puedes notificar una vulnerabilidad, ver el historial de resolución e incluso recibir públicamente el crédito de haber encontrado el fallo de seguridad.</p></content:encoded></item><item><title><![CDATA[Tareas dinámicas en Pipelines]]></title><description><![CDATA[Creación dinámica de tareas en Pipelines con YAML. En determinados escenarios podemos encontrarnos con la necesidad de ejecutar en los pipelines un número de operaciones…]]></description><link>https://www.setvalue.net/2021/01/24/</link><guid isPermaLink="false">https://www.setvalue.net/2021/01/24/</guid><category><![CDATA[DevOps]]></category><category><![CDATA[YAML]]></category><pubDate>Sun, 24 Jan 2021 09:45:00 GMT</pubDate><content:encoded><p><a href="https://github.com/rfcm83/YAML-template/"><img src="https://img.shields.io/badge/rfcm83-YAMLtemplate-%3CCOLOR%3E.svg" alt="Generic badge"></a></p>
<p>En determinados escenarios podemos encontrarnos con la necesidad de ejecutar en los pipelines un número de operaciones idénticas en los que únicamente varía los parámetros que recibe. Aunque podríamos duplicar en el pipeline la tarea o tareas y modificar los parámetros que recibe cada una, tenemos soluciones más robustas y dinámicas con los ficheros <a href="../23/">YAML</a>.</p>
<p>Para ilustrar y simplificar el ejemplo, imaginemos que necesitamos realizar una tarea que salude a una serie de usuarios por la consola. Esta operación, que a priori sería tan sencilla como pintar un "<strong>Hello Dude</strong>" por cada persona a la que queramos saludar, con la configuración clásica de un pipeline haríamos algo tal que así.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/539e1a46f8ec5ec518f859b300c101c8/29114/DynamicYAML-01.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABfUlEQVQoz42S2W7aQBRA/Z8QS+4TL5Uq+p9tlW6BRBEkxOA1MePxLJ7hVGMCIoVGHenI4yvr3M3Rx09TptPPTCYT4jg+5+rqcjyOGY/HA6PRiCRJ+JAkRDfLFUVZorXGeY9SCu89/3N2u92bd+8c0ez+niLLKMuKrRCDMMittZhXtDbHREFyIBznPLZ32N5jbE/068dPFsslm/Ua0TQo1aGD9BStMcacCQMhFqTB3ylF9OXrN27nM+4WK+6eKrJnQbnV1NLyLC2FsLyIjk5KrO0HwSWCMXQRXX+/5nZ2w3yRMnusSPOKaqsQ2iO0o1E9Uukhe2jtUNWZEPbC2e85D8sFj+uCtNrSyg5lLM5D73d7eodz7ji3v9s+xAfh+uGJsizIipqifqEVW6SUGKMx+hVjhiUdpO9WmBc5m82Guq4HkRDijBAPi/nX/A7L2gvznCzLBmHbtoMgPE+RsqVpmmOFlzYdTkgarVYr0jSlqqqj8FQa7u/9NqczDN/8AcXoM3Rh4vj1AAAAAElFTkSuQmCC'); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Pipelines Classic Editor"
title="Pipelines Classic Editor"
src="https://www.setvalue.net/static/539e1a46f8ec5ec518f859b300c101c8/587b0/DynamicYAML-01.png"
srcset="https://www.setvalue.net/static/539e1a46f8ec5ec518f859b300c101c8/8aea6/DynamicYAML-01.png 243w,
https://www.setvalue.net/static/539e1a46f8ec5ec518f859b300c101c8/44c61/DynamicYAML-01.png 485w,
https://www.setvalue.net/static/539e1a46f8ec5ec518f859b300c101c8/587b0/DynamicYAML-01.png 970w,
https://www.setvalue.net/static/539e1a46f8ec5ec518f859b300c101c8/5b795/DynamicYAML-01.png 1455w,
https://www.setvalue.net/static/539e1a46f8ec5ec518f859b300c101c8/29114/DynamicYAML-01.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Crearíamos n tareas iguales en la que estableceríamos un mensaje por consola que hiciera el saludo. Bueno, no es difícil, se crea una operación, se clona tantas veces como se necesita y luego sólo es cambiar el nombre. Evidentemente, esto está bien si son pocas personas a las que hay que saludar y no se va a modificar nunca, te pegas la paliza y ya...</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/e8be0a8030ba1b5bf8d7254939c2a9ad/29114/DynamicYAML-02.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAB0klEQVQoz42S224SURRA5xNkoKUmFjgz3LTFUmv9IC4zhZFg+SJbSvsf9Unji4FE7ANghAEGhssDhAfCMkyFolXiSVbOycnOyr5Jufw5+XwewzDQdI10Ok0qlULTNDKZzJpsNuvEbN7L2CW6rpPL5XhrGEjV7036fZvpdMpoNGI4HLI8tx9u0c80CoVzCoV3ZDJnaOkUuqatSSYSJJMJUskkhpHFyGaQ7up1et0utm0zGo8Zj8eO8OLiPZ4dmUg0hFD8PN3zsufdxeOWcctP8Mgu532Pix2PjHd3B6n8pUytVqPb7TIYDej3+46wVLpCFYI3p6e8PjkhHj/iOH5ELHZIOBRCEQJF+R0hBNLHT5+pVCo0Wy3skY3ZNpnP51wVi4igwstXx7yIHfL84IBIJEo4EkVRVYSibKAi1HukcqVMtVqlZbYxLZNGo+H0s3h56ZShCD8+3zN8+w/4ffv/RPr29Y56o87AthmOh1iWxWKxcEpe9kcRAQJ+338jtX+0sHo9Z8Kz2YzJZPKrh6VHwmUGm/cmqz/J6ll0Oh1nXTaF138RbuNBaFnOhP8ULjN0yy5EwL+1ZytWUqnZbGKa5iPhzc21s3vhUJCgqmxFVcQ6w59g2eiO++prUQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Logs Pipelines"
title="Logs Pipelines"
src="https://www.setvalue.net/static/e8be0a8030ba1b5bf8d7254939c2a9ad/587b0/DynamicYAML-02.png"
srcset="https://www.setvalue.net/static/e8be0a8030ba1b5bf8d7254939c2a9ad/8aea6/DynamicYAML-02.png 243w,
https://www.setvalue.net/static/e8be0a8030ba1b5bf8d7254939c2a9ad/44c61/DynamicYAML-02.png 485w,
https://www.setvalue.net/static/e8be0a8030ba1b5bf8d7254939c2a9ad/587b0/DynamicYAML-02.png 970w,
https://www.setvalue.net/static/e8be0a8030ba1b5bf8d7254939c2a9ad/5b795/DynamicYAML-02.png 1455w,
https://www.setvalue.net/static/e8be0a8030ba1b5bf8d7254939c2a9ad/29114/DynamicYAML-02.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Pero, ¿qué ocurriría sí son muchas personas y/o ese saludo variara periódicamente e hiciera otras acciones? Bien, pues este escenario dinámico lo podríamos resolver con YAML templates de una forma muy sencilla y también sería compatible con el escenario más estático.</p>
<h2>Definición de la plantilla</h2>
<p>En primer lugar, necesitamos definir la plantilla que va a realizar nuestro saludo, para ello creamos un fichero YAML (*.yml), e indicamos los parámetros que va a admitir la plantilla.</p>
<div class="gatsby-highlight" data-language="yaml"><pre class="language-yaml"><code class="language-yaml"><span class="token key atrule">parameters</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'persons'</span>
<span class="token key atrule">type</span><span class="token punctuation">:</span> object
<span class="token key atrule">default</span><span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span></code></pre></div>
<p>Básicamente, indicamos que va a recibir un objeto indeterminado llamado 'persons', que va a admitir recibir una estructura de datos en formato YAML. Además de este tipo, podría establecerse otros parámetros con distinto tipo. Estos son los tipos soportados:</p>
<table>
<thead>
<tr>
<th>Tipo</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td>string</td>
<td>Cadena de texto</td>
</tr>
<tr>
<td>number</td>
<td>Valor numérico o cadena de texto que pueda parsearse a número. Se puede restringir a un conjunto de números</td>
</tr>
<tr>
<td>boolean</td>
<td>Valor booleano</td>
</tr>
<tr>
<td>object</td>
<td>Estructura de datos YAML</td>
</tr>
<tr>
<td>step</td>
<td>Un step de ejecución de Pipeline</td>
</tr>
<tr>
<td>stepList</td>
<td>Una secuencia de steps</td>
</tr>
<tr>
<td>job</td>
<td>Un job de Pipeline</td>
</tr>
<tr>
<td>jobList</td>
<td>Una lista de jobs</td>
</tr>
<tr>
<td>deployment</td>
<td>Un despliegue de job</td>
</tr>
<tr>
<td>deploymentList</td>
<td>Una secuencia de deployments</td>
</tr>
<tr>
<td>stage</td>
<td>Un simple stage de Pipeline</td>
</tr>
<tr>
<td>stageList</td>
<td>Un conjunto de stages</td>
</tr>
</tbody>
</table>
<p>En el ejemplo de Pipeline con el editor clásico, saludábamos con una tarea de PowerShell, incluimos esta operación en la plantilla iterando sobre los elementos que podrían llegar en el objeto <code class="language-text">persons</code>.</p>
<div class="gatsby-highlight" data-language="yaml"><pre class="language-yaml"><code class="language-yaml"><span class="token key atrule">parameters</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'persons'</span>
<span class="token key atrule">type</span><span class="token punctuation">:</span> object
<span class="token key atrule">default</span><span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token key atrule">steps</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> $<span class="token punctuation">{</span><span class="token punctuation">{</span> each person in parameters.persons <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">task</span><span class="token punctuation">:</span> PowerShell@2
<span class="token key atrule">displayName</span><span class="token punctuation">:</span> <span class="token string">'Hello ${{ person.name }} ${{ person.lastname }}'</span>
<span class="token key atrule">inputs</span><span class="token punctuation">:</span>
<span class="token key atrule">targetType</span><span class="token punctuation">:</span> <span class="token string">'inline'</span>
<span class="token key atrule">script</span><span class="token punctuation">:</span> <span class="token string">'Write-Host "Hello ${{ person.name }} ${{ person.lastname }}!"'</span></code></pre></div>
<p>El código de la plantilla únicamente ha incluido una estructura <code class="language-text">for each</code> que itera sobre el parámetro <code class="language-text">persons</code> y que, por cada persona, creamos una task de PowerShell que saluda a la persona por su nombre y apellidos.</p>
<h2>Construcción del pipeline</h2>
<p>Una vez ya está creada la plantilla que vamos a utilizar, necesitamos definir el Pipeline que la va a ejecutar. Para ello, creamos otro fichero YAML y definimos cómo se va a desencadenar.</p>
<p>Como el objetivo es saludar, vamos a programar que ese saludo se produzca únicamente a las 8 de la mañana (UTC) cada día, y deshabilitamos cualquier desencadenador producido por <code class="language-text">commit</code> o <code class="language-text">pull request</code>. Además, vamos a utilizar la imagen de Ubuntu en el Agente del Pipeline.</p>
<div class="gatsby-highlight" data-language="yaml"><pre class="language-yaml"><code class="language-yaml"><span class="token key atrule">trigger</span><span class="token punctuation">:</span> none
<span class="token key atrule">pr</span><span class="token punctuation">:</span> none
<span class="token key atrule">schedules</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">cron</span><span class="token punctuation">:</span> <span class="token string">'0 8 * * *'</span>
<span class="token key atrule">displayName</span><span class="token punctuation">:</span> <span class="token string">'Daily Greeting'</span>
<span class="token key atrule">branches</span><span class="token punctuation">:</span>
<span class="token key atrule">include</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> main
<span class="token key atrule">always</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
<span class="token key atrule">pool</span><span class="token punctuation">:</span>
<span class="token key atrule">vmImage</span><span class="token punctuation">:</span> <span class="token string">'ubuntu-latest'</span></code></pre></div>
<p>Después, seguimos realizando la llamada a la plantilla que hemos creado y la declaración de las variables que va a recibir. Para ello, agregamos un job que utilice la plantilla y que defina el objeto <code class="language-text">persons</code>.</p>
<div class="gatsby-highlight" data-language="yaml"><pre class="language-yaml"><code class="language-yaml"><span class="token key atrule">trigger</span><span class="token punctuation">:</span> none
<span class="token key atrule">pr</span><span class="token punctuation">:</span> none
<span class="token key atrule">schedules</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">cron</span><span class="token punctuation">:</span> <span class="token string">'0 8 * * *'</span>
<span class="token key atrule">displayName</span><span class="token punctuation">:</span> <span class="token string">'Daily greeting'</span>
<span class="token key atrule">branches</span><span class="token punctuation">:</span>
<span class="token key atrule">include</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> main
<span class="token key atrule">always</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
<span class="token key atrule">pool</span><span class="token punctuation">:</span>
<span class="token key atrule">vmImage</span><span class="token punctuation">:</span> <span class="token string">'ubuntu-latest'</span>
<span class="token key atrule">jobs</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">job</span><span class="token punctuation">:</span> <span class="token string">'Greeting'</span>
<span class="token key atrule">steps</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">template</span><span class="token punctuation">:</span> Greeting.Template.yml
<span class="token key atrule">parameters</span><span class="token punctuation">:</span>
<span class="token key atrule">persons</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'Juan'</span>
<span class="token key atrule">lastname</span><span class="token punctuation">:</span> <span class="token string">'García'</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'José'</span>
<span class="token key atrule">lastname</span><span class="token punctuation">:</span> <span class="token string">'González'</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'María'</span>
<span class="token key atrule">lastname</span><span class="token punctuation">:</span> <span class="token string">'Gutiérrez'</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'Lucía'</span>
<span class="token key atrule">lastname</span><span class="token punctuation">:</span> <span class="token string">'Martínez'</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'Antonio'</span>
<span class="token key atrule">lastname</span><span class="token punctuation">:</span> <span class="token string">'Martín'</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'Luis'</span>
<span class="token key atrule">lastname</span><span class="token punctuation">:</span> <span class="token string">'Álvarez'</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'Pedro'</span>
<span class="token key atrule">lastname</span><span class="token punctuation">:</span> <span class="token string">'López'</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'Ana'</span>
<span class="token key atrule">lastname</span><span class="token punctuation">:</span> <span class="token string">'García'</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'Francisco'</span>
<span class="token key atrule">lastname</span><span class="token punctuation">:</span> <span class="token string">'Rodríguez'</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">'Patricia'</span>
<span class="token key atrule">lastname</span><span class="token punctuation">:</span> <span class="token string">'Fernández'</span></code></pre></div>
<p>Una vez completado el proceso, guardamos el pipeline y lo encolamos para que se ejecute inmediatamente.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/70d8e66904019b9d984fb69576f61b73/29114/DynamicYAML-03.png"
style="display: block"
target="_blank"
rel="noopener"
>
<span
class="gatsby-resp-image-background-image"
style="padding-bottom: 54.32098765432099%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABj0lEQVQoz52S2U7CQBSG+5IsISQU8bU0UW8oERTQ0k7pAnZm2iIXvoEPQJClBAjLb2awLCoXepIvPcm03/wzp4p6cYlSqYRCoYB8Po9cLodsNotMJiNJpVK/kk6n5bp4V3yjqiouikUo1aaOdtsGpRTdbheO48D3fXDOEQTBCaEgDMAYR7/fx2AwwHw+x2KxwHa7xXQ6hVJrNGARAtt24HqeRAjFBsdwxtHxKbqUyfUoijCbzbBer7FcLuVzNBpB0cpl1Ot1EEJkKsbYDxnjHLbZwINuwPBewKmPMIowHo9lOiETNZlMoNzc3qFS0dBqtaRwL9mLGTijqD094frBQMfr7BOKRKvVCpvN5iDUNA3VahWmaZ4RUgScgbgUV48uXny6F8ZxLNOdCGv3NTSbTdi2fSIR/Y4kJcNruLsSIez1ejKdGIZAlByK8dyC1bbgud4P4ffe/+qPhaJOhJZlgZgEruueSXiAnhEmRz4Iyf+ESbKk4ngGRdd1GIbxZ2EYhvLHHg6HchjDjw84b+/4BBjn1m5tDNuMAAAAAElFTkSuQmCC'); background-size: cover; display: block;"
></span>
<img
class="gatsby-resp-image-image"
alt="Save and run pipeline"
title="Save and run pipeline"
src="https://www.setvalue.net/static/70d8e66904019b9d984fb69576f61b73/587b0/DynamicYAML-03.png"
srcset="https://www.setvalue.net/static/70d8e66904019b9d984fb69576f61b73/8aea6/DynamicYAML-03.png 243w,
https://www.setvalue.net/static/70d8e66904019b9d984fb69576f61b73/44c61/DynamicYAML-03.png 485w,
https://www.setvalue.net/static/70d8e66904019b9d984fb69576f61b73/587b0/DynamicYAML-03.png 970w,
https://www.setvalue.net/static/70d8e66904019b9d984fb69576f61b73/5b795/DynamicYAML-03.png 1455w,
https://www.setvalue.net/static/70d8e66904019b9d984fb69576f61b73/29114/DynamicYAML-03.png 1920w"
sizes="(max-width: 970px) 100vw, 970px"
style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
loading="lazy"
decoding="async"
/>
</a>
</span></p>
<p>Al terminar la ejecución, en los logs se puede ver que se han creado tantas tareas como personas se han incluido en la lista, y que se ha producido un saludo individual para cada una de esas personas.</p>
<p><span
class="gatsby-resp-image-wrapper"
style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 970px; "
>
<a
class="gatsby-resp-image-link"
href="https://www.setvalue.net/static/a0d02284c55538bd19cd34b7edaef9d9/29114/DynamicYAML-04.png"