From ba1f396eb5d61aa0eed2956aaf96135bd67ecb5c Mon Sep 17 00:00:00 2001 From: Victor Agreda Jr Date: Wed, 3 Nov 2021 13:56:38 -0400 Subject: [PATCH 1/4] OCI function basics article Still not sure I got the image liquid tag correct, but image is resized --- ...ll-a-func-oracle-funcs-api-gtw-diagram.png | Bin 0 -> 178339 bytes call-a-function-api-oci-clouddev.md | 772 ++++++++++++++++++ 2 files changed, 772 insertions(+) create mode 100644 assets/call-a-func-oracle-funcs-api-gtw-diagram.png create mode 100644 call-a-function-api-oci-clouddev.md diff --git a/assets/call-a-func-oracle-funcs-api-gtw-diagram.png b/assets/call-a-func-oracle-funcs-api-gtw-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..74073c2f6c811fe04b6c242df2e89eef1871c41f GIT binary patch literal 178339 zcmeFZWk6iZvNlX`lHl$x3BlcidyoVR?#@hb7&N%MySoQ>cM0z9?k?|SpL6fo$-ejd z_5HlV46|6>)vLRztGnu{Y69dxi6g$odkp~rfhZ{OnFS9CzVrR3ZXEdQ zm5rjf5Jc$+!5;XJY(rH^BUxF9_uy-I2-sI>5KzCWfPWxf;X%OsbqxWb{0jfSueDy$ z{JRdg%~wnizgk8Ie~kQ0A)xV<>!kz!fLr?4x4fyNp@pTcEx?*Y-Wou{OwSB1 zfl7b%pC_h6{#Ogo<>^rWbq$#Xt_NXOP+s$LS{mBwk~msgSlMtp@{#>jgByJP>ox-!$zN4$ z&H2bwW#vhP0oH~jZ1k-3jAZ<;Nk~X|tqqL06-C7UO%DExkIcl@7Rb%O;Naju@4!M2 zur_93;^N|BU}R=sW~KwzptEtZvek8@v$7%oS0n$`j)0Ebsssew8pV(K9mqPh^IUrvD4suaf_j49uhd9@cLU zbJPX?i|8+A{Hu?=zk0x}s%U5fu(10z7Je>vM(~S)>DO=GzdHC^@qdQ*FH$*cQ$sL= z{vu`icm2QL`?J2<|M#Q*Ui>HNe<+o#Ol|p@|NXQ-ZvTzy7n`{MnyP9drj~|QHowNl z&cVjZ@IRLPkCdwap=4tI#gYGz{;lY5q+s@Q3tJoh(v2?wfCc|QRfU(~&pLmQ%Yx^! zfv&Bth_0<6KQkjU6CD#19V5#ZCKhfcHf}a%I!0FRUtRgt%x`u7-3~9quL=3L3Hq&XA7vst6KG zy+$OOLmYm#QbXj2yFwQwJIe#PMk%Eh`iI!Tnd_3NDYG2Jp>LeY$>daeuwY70G2gTv zQc%)IDCjW=*!X8Qh0ck*)(fAV7T8m0_7pmypf#O*)0BeE^0W*BpV4N z+3#;8sgK{s1m&81>HaK1^KO9sqk|%Cf(Q~Q+`9oY<^SmYclnt=y9dun^9n%-j_(Yw z=8qx4OQ7uI{ev@blq7C{@CSbvTRK}ZwokB*bAri0l`)3J>V7~e9oCS}A zAld^u!ztGbR%`FzaCIdsBdb<;4zvqFLPUJ?)?jpV5+jY> z&OTJ`)7RH^^>wGFBJ$x$MfFfm!oqANC0`8Rt*##u>>l7_5*!}w^?$MxX0^54P0CzB zdb2SKCxkk>B9lW}vrV z(rG$D#UMBOqrE)^7x&O~Z~y%V+JnP`4Jyk$Xl91@6r1%&3v(>I+)}T;P-24n(@^IP z4NcHDjCg)!xU+PA9+;b35r825%GlT#dS`laGJ4m4QB^uy){H~$X ztfd`Wu!><=l#OL4h{V(5<7{kdDk^?ZHxkL9+Z>8FxxPN)(a|G59*Pbgp=h33DOaK( zc4$agSa2v(NbqSahy_sMo-)V9&(yva3rW7QF@1sa`qbXm;;q^VzdmWUM>Sq{+vFsM zTx958%0@rQ+u7c~9Fo2|z5gnAeld^uc1 zVgIwSMdx7YCHqP&P)|D>9UX_Xl)TB^yLX;$ZnrigQ$s*Sl`c`(`p1?GtsDbk1pHp_Sl3w9H)2e6I&hv?wZhqBA|CLM zExQ=a^Llx?x4K$_otGmjD>HT}5K*x1u)#L{&n?`)4J?kSR8)YEPsBBA9xQFvzGFP{YbX||wvo{;J2BkFzu z0?lOJDwsdIy0jbsUFrX{SIEj05N1)lv#U76<2VeMhX<%y75wtu{xq7}CPdqYr>2&M zLxxc3N7$SAu?3XzzXQ+Uin9MX!g+LfM0kmy070xuUAY5xvyC+kTdi=;f1 z+>nck0C6#EtEO_ouixt<^Zm2Oavp8z{gYheFh`dM(IhUA)N-=w_S*~wRPTmuHIMe*euu!qK(*py_j1;I^Quu=Tgt(}v&GZzYUEQDZ zD~9z%ad&^@)=WSTQZlH5fhJ&F6C7yJTG-OP#kX{*%VP%?t%-V|R6SZf*0e zBF`Eht0UF(l_Ei6PtUlX9;A!QVS#4vKiC6btPaTztt;)|pe79U2EG##k^+9_DB*MO z9|kl*?5}0$Q;MU*JqXk|t4r~N6dt_ngO^=Wo|&Xc-EZcre~Pi(4gL}lF@}Sk4Cc-F zL?;wf+!7PM6MURz91_MqIS2*01O*jBNC;k}if^m(xbU%rK!yKQOYq!~g^2r!DTz+= zX3Z?^-4w&0Og@PApcCYb+5o0pt1SHwq9TQ4*ANT%fVa8B!OwrZwN@cil8^UK)wKgl zo`hoU$#YS|dg8&+xwP@QP`F4g{dVms6Xej-OU;N$otJasv^`c>GdD9~v$K7*-2?j- z;qB|?3I}bGFPDWiCIwBcwL6=6#Im10QBvd`F24j<5w1DY*_jFdrXthd+k&<8o&rcM z;DwMmYERSCNu&BD_$#oy6!2G2Of0ROfjjo; z_;@(QC8dj-o10rlPqH(I_b`IFyZy&2*{Lb08$r&FPENI~?3XuJ zWH20n{@S9P90Fc$?ym}pLw3h&d%7QAGkm&N}CL}Bb_a1s~MO7u}6&(+U`^s8Yi<{eEsrwn6uejKefOT<8 zjgi@W@#3KiQ~1F6x;gf!!;k6&U%%cSv5?nE`v*m|12*Tigsx{>L&=NNvAK;LWean$ zNZ7y46F5?o^^+GFt<>5)>VUl?+)6}2P7~&sshJICJZvKRG6m2o{qt;pe}7b(%NGq> zV(G8SpO%+}{e*=&^EfQ=c2An!_By;e7C6c@2#AQdZx3zSNi%}V?42l6Qc{{-T~dV+o8`T5cp1|8rskH94-Withx=Co`GC$7w%PzWJEw%Xv1Ze#M!!Zstm1jUui}4S zr8zNPVH+FEIXDnAFsM9C^MMTj@XC1ep7tzD*h&hebXe)?)JoS*6xR%B^E`d>vf689 zWyK<78kN@ia#7~CB0zF_J~x4Ug5m2Ye$0IuT$Hphe>w21j58TBh+TmQ3+w0d0(a6y zNmcJ+(|msi*VRQi27N#A?EA&*_tl_{`PahSg-u9EoJX%;GQ<3Sid346k#kJ@adr8l zds<^-Z^Q;eLt~>lk~r2nRiIKyK?@Sx;J|t0W^izRysGm0(>?YJanO_7<%Iw(!#jTW z^Pu*2Ph)Mj5}g?$<#oOW_p;0%@k&m@US3}?QE=+aU)l*lH=wWe*fz2F2WH2Mb;_UB z`bqPdv95+yPivfp&}B@z3<_!J>YeWNJ_|2(bwT@O8yWE3?B8^dktHWv_;U}a#Kcq* zMMgFv69fl_ROJgg8`dBumUvyXl+#y+pO5cFy$wH8L~?4foFVG*Z(0>?D8qZte2IOo0|Ee&F7BQzP-LaG_qG< zI#IrNiJeA7^`oy(FrK?bp!&4eQ9J21WMWIpF2 zU+_z8UR-Td)x_kcfuWk|mHU0Kz`cVzdR#QC%F-Ifz?cacJ1G+rrCq_NjH42|*5~e* zH@I?g46v1^&dx3tkK+lSyOD_rT-S1n7kQ117*#CWx;3V;^NliWP=_%MVh5RmsVs-ci0*Y{r9#{CIe7Wq4q>!tx zw_nzlFC3g7oL{bSrmdozp5EjB9ZQ#o(^W~WWO5tPCgT2CTZBHsyLY6zYw-jD8`f7H zb4hUw8ARrV?^!B2sDbh%HJ~nuXWLQK%3aHlTX~=}LxI{e zcfTcX2$8J1ZGWoLc3b{A?YuFNZaz*VZIW>7ffW0qW?vyiJM;DmoD2k7iM_ zS$BG?W7^$2b8?jSv?%X&n2lyIer${++TE1_JLd&0B_$~=GcGS|i3vLGba`CmfARJ8 zA#^*2A#=fdKiNAI$L2O|l@qJ%Z#*HdB8{l#q+W9}XB>?X7Cf|45p*Ab9hh5I{IP4nfTKassCu{2om1;)kPZUu(;4s zI!pCl-gQ@rRY};gx;uDo#w(8&cCi1r^wZl&n=m${UUQ65rKGg^MM)pd7CpA^cdYLy zmlS=cVwk?2ttlvEvv&E|=^5n|ZB5*5QzFNqJ7{`R@XTuV%=PAYn$EOeOlnSOH$VXQaKM7KV3#)I|n;*WfNas zpCu^iwA8ZrU1ovQig!o%1&gpl3$}|fCnmD8$n`h$mD7eAB?I3)8i|X`#7mxOhN+@p-f$aNT#nEpu?l%vE{qZh2fdh;5t(%3E~5t==xP!FYs3q&zy| z5t1Cd-9I%oRidH!%24S?tV6;bWMPt`5a0z`cUGz>Y1O#i@E`m@7kh$oeS#Kg7e+%K z^+->@`+`WthBXs|Eg+_~ZACY0vr5v=g=$1#e%;wXP#ob-h<%hrsd(lb}Xc)h-g^?Pt=i=w<^Lcb}VCR@AND=@*Vs)@iU+Enk zrSbYIh94FZEDvFMxW6vt{{=hlB!9v*3jHGvmAw$N3(313D9&2ydGg;3#Dgdgj`j;< zEa8aMUNMH0u_T#dMWP^gSINdWctTMT7KYMHIf{L{upH`RS;^m3bsqmY zKfbWUr`@mi;OhG1ued>s;y<|S#ZwCcHK>Jg76lL224igPZ6E7uRjR7!zw3;YARE?! z5nak)R~Uhg|MrdTVK$S1ZV)4&R>T>>B{c+UParjuvl!Cz3l^5{P#!rsl{Awy?fh>* zm*!^85nk057rVU*C|kg1xQ>FVl`P&%`aSia!{Rd^Huo5AapE-BrI zeIJ|JQcY65Ktb3n<)6(wwWV5mQ`#~vE=E>F@6Gv5>O>-i!rlG+VAYfGn94Hl_X}wO z8ukA2KL~shrACK(@T(fDs!s2xwtZov(I_9BL4!otKUo)IJ9>P}T8Zxv6tss!LT21$2tx|SQjr#b zwdQ;K4eDC_>`W19k!YA`dU8kH_7Tv)JYL&Jn95T9w@tR&MZL(!Yi}hzMgz_Qj!Q#Z zQi(no8EE)R%h+1iWUPfKpLz!e2Mo_9dvS%f=K696d(KV(<0%+iWDV;ThPu09Qp9@T zCw2C+GDm9cSuu%Gr_d)hF3MUyEnllG4>`JFdrwd^NZtGO003WBPyGwQ#2NkaFJTRHQ1nF z$pPa{lCmdRtp`+8qL&z&eAby2r#8?N;v=tzer_0GzePZN7`bwr{J739xB4psA6L+;-~1%Yjr&QL_Dh5{{60GI&}pvi&0Te3LfAg zX9LEaw;5$Gi6P^tXm^j{&Ndg%0%un~1r3F_#x>a5pcF+0TcT>z0r1%f4S`0|qsz&W zsR5T@=D;YjRJxstyE`B38#;&XMM6r5+gcn?TQYq^5Th3iOi*{Q?(q*yG66|TOQ_C{ zxWaMPRQ~89ga6qE|J8f9d4Z#7KuWDNfMl^o|E6XMgZ%|P7xNnGT$bLj4vp95yyL8<>VrRfqdpjH9 zT*V##{;m$8fej_I^iG~=nAonL3EzNr9ZMKK0dHuhMKvtdj7>fxsDJ(G`IWE`66?oQY;R}PwHfBeV>@!K^1wSam8(92N` zS>JPVvQhcwvpw_kuh17e{I+5Lx{WfFFpA}!BIx0d7K|z8sns6VB*$Fs&Q|caSs)qZA z{+aEgwRSxrklD=t09+LbLa^;_Y;75(8C0Qu$;~P&D=$8DGc-I|T{XK@xBJba`wJ5* zhWiD4G(J4wb947OrJ*;u_4v38`U>cveSK;P-%*f&&6bG}r&)%i!RuM^^CuV@nO9eLae1;oTsql0 zYQEJEi3A%&9A#P!?hnci#&E_A4(5UuF6(A*gy_R6dqolLs?}fHdy9&2m*_^KC0bco z@-)h!i8?NJIBIeU8x)!9lvD==3Z=?Uw2AvZSkX^JY> zd%<3Ye^JhBp-BaGn~STU9dVi5x~}ZQrpMh`&Xb&?fgF1`+b-MIQ)N-fZ!U_jzXJ>W z7CyV_ximF2MU$TJ18LYv6~2!V#dH6*QIMnIuqJRn-0yO=Yai~lLTB(@PIp(pcT8{R zwtKz;yHS&?p?nV-GhKS@tele*OMG_})=|Nsq2sJtl?Ut4`RKn5qNSYoRhvMYcqZ2C>3{5{xS zfnl;oc_+SzfEK$^0w?@iHq5QO)>~GGh3k|DB-ZJfrB>IfoC;k%J+k*y_6wzaX91GF zr}(=k3{7rV(^G@1c!wu1`&D5KDO@qJG0i7q3KkC7a;{v=+|GyHac5M`-|mELggZ;0 zM$2Wsxws_X(+*1U%zwQ%emi_yV6?SqIoHxTGrA(wQdS!`Kr0>8+tX7=(d6m^woTaq za{~*04sWFYLWn91&Z=(Qch=TWanUdC7f#Age`N2jm6*r9u|JWO9Av}>U54|Y@Y!aU zH9jn=Q2WBd)t<~X?j&@I(SqFz&J-<9*T^--@#II#5taZpahXoATZ=-KS6z>b$LT|r zovqk5Jp6R_)F^s$tcQ`am!v|ExkUH&HKOa@6^ECwkmM80=9dO)U+U}>62t#Zrl+W5ubVf>vD$B+_5i6TSA$5O8gu zix~WTVHLdIW*21<)}L>Oxg|!&`YOL``gV0*KjG_x0yDd^z%w?3jfy#Zy}2m@kaN(q zt9JiLVvfO7n9-8&C*|DO_{rr`P+NNxgGn+kch+m!+|;bNkOs7ORV!pPoz2cR`Lf^o zj6I3*<~leJ>eHtYK21%cR4p&4Cx=pPmIU9Br`d!2c7jgdn~90swKd;)yw@txvC;g_ z5-akNti%4{sk= z-rGAkjbR-(|^zi+vn}Fc(2PN}yBs<+jVw7^Ds| zHwT*Rc27`$A2 zTnrkfxy~Hh9R25OxpsJtV-$J4-SC0R$f4vWDDhAjXqXs&H`}!$bV5r@>`@m?JX9hS z9NW{~Ggr8<#X1*M8!|vx%cpwN{HwE)@+;#WfA%0*qsGb9 z^73-A!RF?vO7YIKvbm7a*2fXBDmm5l|8)WY3 zo&>z}LOq|{Ndp7APrGu@yj*lCL}b_zVAyD{bF{h6b(FvOJ0jau>(ds4$6dGIN$b@{ z+E=8R-#27lLC7IDCtNH%P=l^8iej0X94D6~(!8*}XlS=iYD z&B-5?;>ZsV&Id(B%p5!EqOzS{8u0IM)tD;2X`o>AU`_~-v~j-n*=DYasuj!np;r)& zxV&w#WdFEzqJ~uQZ0mUxSUJ9(D@K7Ubut&H-MMIt5gH=L$c{t$eVTVZ!7xffL+j0# zx;F7+D=UGgpw^zODH@ism6^p^{|Zz%6#{cakdC!;PpX$6gUgknXup2fd$+tdU-H9# zn^-!Q@ZPr%8#DdMynQVQg&_&7@1s8WZPe|{%8e#&l?~5M2Ksp9#i`i3d{+_^q(1a+ zB4nZ?ZKEpMUPq7oU^bRdAZlz6*F9m~gES;5KBG1-`ikr&HxF(ghfb}%{~uCcdV4;3z@K_V@p$0)8m_48(!l* zlU$4&S<<@10OA&SlgZ;_D+Hl8e3pNA)WISYbaNB0vHBJDVF?xM)Ue zTmMik{+m_CP6IZP%5xeUi!(f7ymeo_Li5JIY@#2tEN%@WT6}tZayV;v`xYq_8L9oz zC(OjbnEFif16(C56YGb^?VKRtPOnZc;Tx-!CfB3aJw0Bd{Bg;#OoPiNTxL1!P0h_r z5~W`(r3?KsU|{{i+w^0d2<-N^O46C7^$I%vz9JWiLWBu)w5)D#3!uyE&kchS@wy(_ zA#eNaYr~l$s2RFf!EPM%nwyYPGO|3^>$E>BzDcAUmyV3Cybxw+6gQ?sq(r4wC&bvr zqk}yo3CQ+&uwoEKd!$WMVpk1Ib*rHbZY!{a7SP*9o@Qux261&MhBY?wC6EqDGc7Hu zM(+K1Xlp-eywS_~Fy8TwBLqF?$JeN z59SIu#6TT%=|8DgXQ)TIDcH7XBrjeU7D;q^OIsF^6W)zlKw$KFRI$kfBheEvWsL8ALf_DmN2 z&7{{DWdbRE76lilL+I5z=Kt^(~^Ht8#993LO^ zO2jAQoE+^l7XwY26wxs46DGdkFtB1Ox2KkViiE=h0a*=AiT%(uVJC3$`>5GzB#DHQ z^v;t8TAl^opei^MsH!VT;(feU)D?ZFV1A7I4r{J6FGAs`Zz=gJK1xZQJ~x|>aU&zK zJz~N$PEJmr@nw;b-Uf#RSL*&)+t?A$gg;y`&^C}i%x=qqyD6fjZT*Zg&T5LVffnU& z{8{_6l7ga)j6#;t_;l2Ad3{B@iRjC3c5xdzb=zaCl3Q%TY2|}{r=jgHxF1mvqFxlX znYVEG6?i#%(SlmeY^qeD+wNm(j3sLs1Lbz8l+cysF?9jsQbj^YOY6C7r%W@pP}R49;G z8wtH$U6sGD0V3Xi`Axv=Sg+K-hu2?7Wpgg7k`Uz8rlx8=AQ6k6Pkm8dY;lXpagAWA z0He?%4w|jNkyQ_K6AiudCH$EPF_ZW9l|L9*d3kL{TON;io}j#D(b4dHA)B1Gm^+Fq zN~Z@0^T6SvL%)lN>`z$RYcTgbWEGEIn|DXK{XFS%@+nX)&kZg2gNBU-Xeze4a`-ZuKmdY zf>-$UM+fusrF?F@{QNC+e0*emyjL^kN(ieVbMl{s6&)?UWefJ^L~WPXlg=7>%TpBg z>_T9zh1N`8Pb;rKgCkk@w|cG23<>(iHo{&>emqnkiVehc37Grew>t|AX-K@w`no|r zsRMApz6y?)p>XQ;z{0}iV&eb#McXfhk((YVfQ_43s2T@W+$i=@;Vrthgh_sxJ48o+ zzF!bDo4?KWWi(fauCf(TWH3x%h@IUoH{@t|ZU>F&9d?kO&1WcG=>qRig`UB|psnw! zNX7$x_%WYZK)3o{`USDmon&N^&bnWGhEZB4LTlJrlcK7kd|)}9LC)o`nOTjojmOzD zDZswR9274u5MUn!az!_c3s`hF_Apqx@KSzX3&B{8ah!KPhHIDrm7q&H5t$Ij87q@J@1wvB!5Rx>zbLolkKxP>V0XWc2V zNi0sK?0-t_;DfX(E&Y`hW1la0Z`5h{BO}XeE5LU#nna`dA}{gJC$0AXN(>4(kkG(w z5dAPfy}(ud&x9YwxPL_(--vZ2XH#IIkI~tRhl={gX%`I8+54?D8N3(oVjUdfB)RX;6!il zj8l(-n}vmKdaJv&UPqw^Is)Unw$?)mamoPJ-rk=4VMX72aP&JQI?|vjJ0t=%s+t2@ zlA*b&pz|?)IHRH6@m0ql3^YA`tZf#SExxnY=b`G&j=JQO5YKqu`WD|=b6jlU?T*_g z782XMNBJ3!7tNbx$>#b_Mt)ZoX_FSgh_nE=PeBO4n**3R2i46RrM zcmpGupd0$+$IRN=UPTX6XIq&=PyNvxL&K`7hQjmlf~b(I>PHPc!+b7A8poYyV|zZE zKGTU@u$C9?jK*T|5fBnqeCd$kqi$X8K53QI71VBu?6g|W9DnC~c!YvfNKzR|qXRqodk4O8wHyQBo*B$| zdPx@S`BH7}f5&u=mqYErGWmD>z_AkA0zrt{NJ?(T+&S@q{s!QHjI6H%hE-ho_!hkq z;J?bClv*9@uAx4AdPcV&{<2hOCPGeY%5@t0k3s}GKep$k5E7zq=*L3xsu*KoqTv~_ zc1;*kq0bUCvbt#Y^!E=A^04wICt!i%p&jh(-y*%0QRmB1<{ z|J|qET9mH@fA$y*B^A;Rm>1E49SCr|Q$Kr|zg92ubF!x90|-P*J5W4D0u$f$xg{sd zbz%s+KKnKToGuBWy)YfS-EiNq8n0>~qhx2Ou3mJdL9puD%!j#^Q=nd>*KT5AWtLx7 zt?c#XJNyUNOW;n$2F?KN!vk2BUzDN&%PmoN&cb$EcMJjmOEXBwOiFsDccfgD%X#WssB?1(ou6|~cjLj)O?s$Q9@Q}a1?b4ShTQq7 z-ng*B!uO5bJoQG!gFjf=V`DKMe0*&xlx8Nu2#s2ipwxMkmX>hIBuX78$s9<Qfq)uOiu)hw~R5=4BT(fb^He{?S2cDaS7Jy)eH#0(b+^Xw-Im zL!SCmDYeOQP5N+a%9xq!=IV^X_n?=9vG421nMn@=BO}R&?{6&T``^81a(WwbJB-+o z54S}S6R)S?>4}P(a0lb){dMBwa#xOFu$-)1Nbss=qGmZ%{4`8*N=k?R`eIXaLDyU- zITuea1I_K;K@WwTYfn%85v-W#&0Az-S(zVfY?D)8NVDtDbTPW4@#5l>6B81`lg%7W z)IX2^>*z|`SMYvxNA_2gnK`S{*mC`AsIHazlWVhK7;!Z#n_l|C@qQbQ1TKN2BSBJf zbTEuS%1=>6CUdSy^J9p36kJkkiQV^#{n;SBO_PxG+89GPeC+U*rQCUO^8Y?B#k!r5a{ifRkom zZs9h!E!PqY%=2482e3V~AI8DJt!F#0To^q3>-qF&5Y7$v!h%M!CZw=Xyx9#ha)|6F z=ev7mab)<{NN*7huhNNQz5U@QNoa0sGP`c8wpq-1xS0Z4)p$x)d__dgjhl_9YZ!hw z9H&-K+?NR3LESnv-hi!z)vt34Q*$d5ODjvmP;7^q>h{O>4t86W2B9Zw6|W*ED%01& zxF~P%hUDv-0*}=(kJZ(W$sC#bb<3RHhogNfJ!w~aHOt#U*D2WX+B#z+~3E!-+&eJUkb{uxuk$__hF}=bGc|>*wX;HP2VUcaKU+(L_$qTZ<(N z!3-^I$$5Yz0E*TAQc6nCz?A26OF@At5tEKzSYVK`7cQh$H7_}Pg3NU1&Va0xbZ<@q z-mTR1%$MQB=36-EE^4s9=X((AhXaOvRSQeZR}08;-K;2qMgu>`<&j+u>irr>@j_iJ zPg%nk_(~6p(U60JyPVpYXV&9_m0)9Qr?rc&Dw~DeQozeZTAYfqPzTuJ`k<)60Hq}* zP&gnp>TU-K6|_a-CP_|4rmwHpv^f0ixVN{LOWw=PGw;OMpHPD#Eh)=_#^dYj%YV}$ zT~b098x|b08z0~1@iA+tYP2~#HkGO9qr5y&QL$1%XXlttP*70Dr)1F4**VA92oGj_ zd_2v4FQ%nM>j2WC2!HxxsvaKBfDwIInd|s19$`5{BM9 zha~NezFE%ac-!-_!rH2;yf<;TXMMA`$DXe;pKMtxd4UOtcd7t7bIXEU! zS18%v^-p!$7`PsnK;jj4poS>6ga@K^DsU!)t$N3kZ7j= z?se!H&Btg}XXR^~G8YD3W@{bbs^D75!iv^sDP+~j`yOOBjI?MOOSY|?JUN$7Pt$z* zCGAxVnMH3jmX;C^l3MN$^Wjn?~D{_43vQ;EF zo!2SA)<(}&2S;2iR;sYm+7B)|(%@9q=XDT-;VIgH@I3UBX|gI?nf8d^0q!%u(#g z>&kj+unh~q&8iBjs*U3yG8{=t9v`1*v_H`;K`mOXlUGklx}{}sJKR5RalO$RBt3BP zGM+*{Ui=kXvJvK6fCgS7hrtI1bnBs@q7SZcpS0@RBYzudV0hO1tcVE7IR-w7vef$d zHvbf>H37ckk&x#zOO@rbV<{hNFsTDTi-FdSm7P1b6$BXHCiviyp#DZowsWyhEvETe zQ!$7gfdo~UJnNPP1fGthZ_Y>zn+;!1%Nv8FL7&MX1GapMN6MXU?^ovLC;ineRK&%> zps88-&ii27g^{JTj10GSQrD#1uXy(yogHad0!LQ*bw#tHWyOKF{oB! z@g3k^pBg#8?!`U8n`J*qNL_d0KwhGeyiQNjM2T>V37sho-m4@trc zkh=CGCOmp`WM;UtxgvM}zWbtB)DKq7ktlbyM?|JE`f_OV$K@6I8{x;N+T0wchI*gj zu8$S`4$|}X>$<1KP<1ymwYA7$!QS@|pjm1T2mW+ z+XX`l8Uex3*X#R+`Llp;?(Q0=Lp#8y+Jjjwk!*b_ph*wm{ zN?}3A8Z93)kt_(~Kd7qKISneiSYUCQRST>?`?wP>XXFch_x@RtA|95vW5qNsRBV4x z=$-?A`Y<*ze-1G?y9&_~@qk3Q)zhpPQ>MoEIM)19)@qRPTKCNd7Fr^)ljYi%xgG5; zkUu2^^6^TiJqMeq)*}H5PG6>G&j>Fi7bPN{pIUBCeL+c%;q<;qYLkKGNc)kEvvXly zV_t59wch&8o?`yM)D-1AE;gEYHkgsRq*z|JE-20ePjoU`viE@~3bQRh>4MV2-IIrD zXDqu;>w#6UsKoW16B&@?fItHYaDJ$S%zD!J>@0A>!}Ql@-{b7i(%C2mhTImKSV-EcYNJHcppe~x)|NpuK~K9 z0;j>=NNR$3(JADQs^9FKN*X1=tpVAw4`p

txWYx@KXX1PhnG{6Da#e&pOq#-YG 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 z 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 **Note:** Docker includes special Linux support for WSL 2 on Windows 10 update 2004. +{:.notice} + + * MacOS: See [Install Docker Desktop for MacOS.](https://docs.docker.com/docker-for-mac/install/) + + +**Oracle Cloud Shell** + + * If you use Cloud Shell, the preceding list of software is already installed. + +## 1. Gather Required Information + +Collect all the information you need to complete the tutorial. Copy the following information into your notepad. + +### Get Compartment Information + +To create a compartment see [Create a compartment](https://docs.oracle.com/iaas/Content/Identity/Tasks/managingcompartments.htm#To). After your compartment is created, save the compartment OCID and name. + +To get the compartment OCID from an existing compartment: + +1. Open the navigation menu and click **Identity & Security**. Under **Identity**, click **Compartments**. +2. Select your compartment. +3. Click the **Copy** link for the OCID field. + +Save the compartment OCID and name. + +### Collected Information + +Ensure you have the following information written down for the tutorial. + +* **Compartment Name: ``** + + Example: `my-compartment` + +* **Compartment ID: ``** + + Example: `ocid1.compartment.oc1.aaaaaaa...` + +* **VCN Name:** `` + + Example: `my-vcn` + + Open the navigation menu and click **Networking**, and then click **Virtual Cloud Networks**. From the list of networks, select your VCN. + +* **VCN Public Subnet Name:** `` + + Example: `Public-Subnet-my-vcn` + + Open the navigation menu and click **Networking**, and then click **Virtual Cloud Networks**. From the list of networks, select your VCN. + +## 2. Perform Required Configuration + +Perform all the configuration you need for the tutorial. + +### Create Functions Application + +To create application, follow these steps. + +1. Open the navigation menu and click **Developer Services**. Under **Functions**, click **Applications**. +2. Select your compartment from the **Compartment** drop-down. +3. Click **Create Application**. +4. Fill in the form data. + * **Name:** `` + * **VCN:** `` + * **Subnets:** `` +5. Click Create. + +Your app is created. + +### Setup Ingress Rule for HTTPS + +1. Open the navigation menu and click **Networking**, and then click **Virtual Cloud Networks**. +2. Click the name of the VCN you used to for your Oracle Functions application. +3. With your new VCN displayed, click your **Public** subnet link. + + The public subnet information is displayed with the Security Lists at the bottom of the page. + +4. Click the Default Security List link or appropriate security list link. + + The default **Ingress Rules** for your VCN are displayed. + +5. Click Add Ingress Rules. + + An **Add Ingress Rules** dialog is displayed. + +6. Fill in the ingress rule with the following information. After all the data is entered, click Add Ingress Rules + + Fill in the ingress rule as follows: + + * **Stateless:** Checked + * **Source Type:** CIDR + * **Source CIDR:** 0.0.0.0/0 + * **IP Protocol:** TCP + * **Source port range:** (leave-blank) + * **Destination Port Range:** 443 + * **Description:** VCN for applications + + After you click Add Ingress Rule, HTTPS connections are allowed to your **public subnet**. + +### Setup Policy for API Gateway Access to Functions + +Next, set up a policy which allows API Gateway to invoke functions. + +First, create a Dynamic Group for API Gateway. + +1. Open the navigation menu and click **Identity & Security**. Under **Identity**, click **Dynamic Groups**. +2. Click **Create Dynamic Group**. +3. Fill in the following information to define your dynamic group. + * **Name:** `` + * Under **Matching Rules** use **Rule 1:** `` + + Here is sample name and the rule you need to fill out. + + * **Name:** api-gtw-func-dynamic-group + * Under **Matching Rules** use **Rule 1:** `ALL {resource.type = 'ApiGateway', resource.compartment.id = 'ocid1.compartment.`'} +4. Click **Create**. + +Now create the policy for API Gateway. + +1. Open the navigation menu and click **Identity & Security**. Under **Identity**, click **Policies**. +2. Click **Create Policy**. +3. To define your policy, fill in the following information. + * **Name:** `` + * **Description:** `` + * **Compartment:** `` + + For the Policy Builder Section + + * Click the **Customize(Advanced)** link. + * Enter your policy in the text box, for example: + + ```console + Allow dynamic-group api-gtw-func-dynamic-group to use functions-family in compartment + ``` + + > **Note:** The last parameter is the compartment **name**, not the compartment OCID. + {:.notice} + +4. Click **Create**. + +You have created a policy to allow API Gateway to use Functions. + +### Create "Hello World" Python Function + +1. Open a terminal. +2. Create a directory to store your functions and change into that directory. + + ```console + mkdir my-dir-name + cd my-dir-name + ``` + +3. Create a Python "Hello World" function with Fn. + + ```console + fn init --runtime python my-func-name + ``` + + This command creates a directory named `my-func-name` with the function and configuration files in it. + +4. Change into the directory. +5. Deploy the function. + + ```console + fn -v deploy --app your-app-name + ``` + + Various messages are displayed as the Docker images are built, pushed to OCIR, and eventually deployed to Oracle Functions. + +6. Invoke the function. + + ```console + fn invoke your-app-name my-func-name + ``` + + Returns: `{"message": "Hello World"}` + +7. Invoke the function with a parameter. + + ```console + echo -n '{"name":"Bob"}' | fn invoke your-app-name my-func-name + ``` + + Returns: `{"message": "Hello Bob"}` + +## 3. Create an API Gateway + +To call your function, create an API Gateway. + +### Create the API Gateway + +1. Open the navigation menu and click **Developer Services**. Under **API Management**, click **Gateways**. +2. Select your compartment from the **Compartment** drop-down. +3. Click **Create Gateway** +4. Fill in the following information to define your API Gateway. + * **Name:** `` + * **Type:** `` + * **Compartment:** `` + * **Virtual Cloud Network in `:`** `` + * **Subnet in `:`** `` +5. Click **Create**. Wait a few minutes for your API Gateway to be created. + +### Create an API Deployment for your Gateway + +1. Click **Deployments** in Resources section on the left side of the screen. +2. Click **Create Deployment**. +3. Ensure that **From Scratch** is selected for the deployment type. +4. To define your deployment, fill in the **Basic Information** section. + * **Name:** `` + * **Path Prefix (example):** `/v1` + * **Compartment:** `` + * **API Request Policies:** Take default values + * **API Logging Policies:** Take default value of **Information** +5. Click **Next**. The **Routes** dialog appears with **Route 1** selected. +6. To define your route, fill in the **Route 1** section. + * **Path:** `` + Example: /http-info + * **Methods:** GET POST + * **Type:** Oracle Functions + * **Application in ``:** Select the Functions application you created. + * **Function Name:** Select the function you created in the configuration section. +7. Click **Next**. The Review dialog is displayed summarizing the choices you have made. +8. Click **Create**. Your deployment is created. +9. Click the Deployments link for your gateway. Copy the base end point for the deployment you created. + + For example: `https://aaaaa.apigateway.us-ashburn-X.oci.customer-oic.com/v1` + +### Test your API Gateway + +With your API Gateway and deployment created, you can now test you installation. Create a simple script for the `curl` command. To create the URL for `curl`, add your deployment path to your endpoint. + +1. Create the script file: `touch gtw01.sh && chmod 755 gtw01.sh` +2. Add the command curl command to the script file: + + ```console + #!/bin/bash + curl /http-info + ``` + +3. The command returns: `{"message":"Hello World"}` + +You have connected your API Gateway to a boiler plate Python function. Next, you update your Python function to display information passed in an HTTP request. + + +## 4. Update Function to Access HTTP and Function Data + +Next, modify the boiler plate Python function to access the runtime context and display HTTP information. + +### Review Starting Python Code + +If you look at the boiler plate function, your Python function looks something like this. +```console + import io + import json + import logging + + from fdk import response + + + def handler(ctx, data: io.BytesIO = None): + name = "World" + try: + body = json.loads(data.getvalue()) + name = body.get("name") + except (Exception, ValueError) as ex: + logging.getLogger().info('error parsing json payload: ' + str(ex)) + + logging.getLogger().info("Inside Python Hello World function") + return response.Response( + ctx, response_data=json.dumps( + {"message": "Hello {0}".format(name)}), + headers={"Content-Type": "application/json"} + ) +``` + +Using this code as a starting point, the sections that follow convert the function into a Python function that returns HTTP and configuration data. + +### Update Required Packages + +First, update the function for required packages. + +1. Update the `requirements.txt` file for the `oci` package. + + ```console + fdk + oci + ``` + + +2. Update the `import` statements in `func.py` for required packages for the HTTP features: + + ```console + import io + import json + import oci + import logging + from urllib.parse import urlparse, parse_qs + ``` + + The `oci` package is required for some of the context requests. The `urlparse, parse_qs` packages are used for parsing. + +### Add HTTP Request Information + +First, remove the main body of the function. The `response` method and related code are added back as we go. + +```console + import io + import json + import oci + import logging + from urllib.parse import urlparse, parse_qs + + from fdk import response + + def handler(ctx, data: io.BytesIO = None): +``` + +Next add code to display HTTP information in the response. Here is the code with comments following. + +```console + import io + import json + import oci + import logging + from urllib.parse import urlparse, parse_qs + + from fdk import response + + def handler(ctx, data: io.BytesIO = None): + logging.getLogger().info("HTTP function start") + + resp = {} + + # retrieving the request headers + headers = ctx.Headers() + logging.getLogger().info("Headers: " + json.dumps(headers)) + resp["Headers"] = headers + + # retrieving the request body, e.g. {"key1":"value"} + try: + requestbody_str = data.getvalue().decode('UTF-8') + if requestbody_str: + resp["Request body"] = json.loads(requestbody_str) + else: + resp["Request body"] = {} + except Exception as ex: + print('ERROR: The request body is not JSON', ex, flush=True) + raise + + # retrieving the request URL, e.g. "/v1/http-info" + requesturl = ctx.RequestURL() + logging.getLogger().info("Request URL: " + json.dumps(requesturl)) + resp["Request URL"] = requesturl + + # retrieving query string from the request URL, e.g. {"param1":["value"]} + parsed_url = urlparse(requesturl) + resp["Query String"] = parse_qs(parsed_url.query) + logging.getLogger().info("Query string: " + json.dumps(resp["Query String"])) + + # retrieving the request method, e.g. "POST", "GET"... + method = ctx.Method() + if method: + logging.getLogger().info("Request Method: " + method) + resp["Request Method"] = method + else: + logging.getLogger().info("No Request Method") + resp["Request Method"] = None +``` + +* The `handler` function receives system information about the current request through the `ctx` and `data` parameters. +* All the data is added to the `resp` dictionary which is eventually returned in the response. +* Notice the function runtime context (`ctx`) contains much of the HTTP data passed from a request including: headers, request URL, and method. +* The `data` parameter returns the body of the request. + +### Add the Function-related Data to the Response + +Next, retrieve Oracle Functions related data from the context and then return a response. Comments follow. + +```console + # retrieving the function configuration + resp["Configuration"] = dict(ctx.Config()) + logging.getLogger().info("Configuration: " + json.dumps(resp["Configuration"])) + + # retrieving the Application ID, e.g. "ocid1.fnapp.oc1.phx.aaaaxxxx" + appid = ctx.AppID() + logging.getLogger().info("AppID: " + appid) + resp["AppID"] = appid + + # retrieving the Function ID, e.g. "ocid1.fnfunc.oc1.phx.aaaaxxxxx" + fnid = ctx.FnID() + logging.getLogger().info("FnID: " + fnid) + resp["FnID"] = fnid + + # retrieving the Function call ID, e.g. "01E9FE6JBW1BT0C68ZJ003KR1Q" + callid = ctx.CallID() + logging.getLogger().info("CallID: " + callid) + resp["CallID"] = callid + + # retrieving the Function format, e.g. "http-stream" + fnformat = ctx.Format() + logging.getLogger().info("Format: " + fnformat) + resp["Format"] = fnformat + + # retrieving the Function deadline, e.g. "2020-05-29T05:24:46Z" + deadline = ctx.Deadline() + logging.getLogger().info("Deadline: " + deadline) + resp["Deadline"] = deadline + + logging.getLogger().info("function handler end") + return response.Response( + ctx, + response_data=json.dumps(resp), + headers={"Content-Type": "application/json"} + ) +``` + +Notice all the Functions-related data is retrieved from the `ctx` object including: `AppID`, `FnID`, and`Format`. + +### Review Final Function + +Here is the final function code. + +```console + import io + import json + import oci + import logging + from urllib.parse import urlparse, parse_qs + + from fdk import response + + def handler(ctx, data: io.BytesIO = None): + logging.getLogger().info("HTTP function start") + + resp = {} + + # retrieving the request headers + headers = ctx.Headers() + logging.getLogger().info("Headers: " + json.dumps(headers)) + resp["Headers"] = headers + + # retrieving the request body, e.g. {"key1":"value"} + try: + requestbody_str = data.getvalue().decode('UTF-8') + if requestbody_str: + resp["Request body"] = json.loads(requestbody_str) + else: + resp["Request body"] = {} + except Exception as ex: + print('ERROR: The request body is not JSON', ex, flush=True) + raise + + # retrieving the request URL, e.g. "/v1/http-info" + requesturl = ctx.RequestURL() + logging.getLogger().info("Request URL: " + json.dumps(requesturl)) + resp["Request URL"] = requesturl + + # retrieving query string from the request URL, e.g. {"param1":["value"]} + parsed_url = urlparse(requesturl) + resp["Query String"] = parse_qs(parsed_url.query) + logging.getLogger().info("Query string: " + json.dumps(resp["Query String"])) + + # retrieving the request method, e.g. "POST", "GET"... + method = ctx.Method() + if method: + logging.getLogger().info("Request Method: " + method) + resp["Request Method"] = method + else: + logging.getLogger().info("No Request Method") + resp["Request Method"] = None + + # retrieving the function configuration + resp["Configuration"] = dict(ctx.Config()) + logging.getLogger().info("Configuration: " + json.dumps(resp["Configuration"])) + + # retrieving the Application ID, e.g. "ocid1.fnapp.oc1.phx.aaaaxxxx" + appid = ctx.AppID() + logging.getLogger().info("AppID: " + appid) + resp["AppID"] = appid + + # retrieving the Function ID, e.g. "ocid1.fnfunc.oc1.phx.aaaaxxxxx" + fnid = ctx.FnID() + logging.getLogger().info("FnID: " + fnid) + resp["FnID"] = fnid + + # retrieving the Function call ID, e.g. "01E9FE6JBW1BT0C68ZJ003KR1Q" + callid = ctx.CallID() + logging.getLogger().info("CallID: " + callid) + resp["CallID"] = callid + + # retrieving the Function format, e.g. "http-stream" + fnformat = ctx.Format() + logging.getLogger().info("Format: " + fnformat) + resp["Format"] = fnformat + + # retrieving the Function deadline, e.g. "2020-05-29T05:24:46Z" + deadline = ctx.Deadline() + logging.getLogger().info("Deadline: " + deadline) + resp["Deadline"] = deadline + + logging.getLogger().info("function handler end") + return response.Response( + ctx, + response_data=json.dumps(resp), + headers={"Content-Type": "application/json"} + ) +``` + +You are now ready to retest you function and see the results. + +### Create Functions Configuration Variables + +Oracle Functions allows you to store configuration data in your context that is available in your request. Configuration data can be stored in an application or a function. The following commands store database information in the application context. + +* `fn config app DB-NAME your-db-name` +* `fn config app DB-USER your-user-name` + +For more information, see [Fn Project's tutorial on runtime context](https://fnproject.io/tutorials/basics/UsingRuntimeContext/). + +### Test your Function + +1. Redeploy the updated function. +2. Invoke the function to ensure that the function is working. +3. Run your script again. To get formatted JSON output, use the `jq` utility which is included with the cloud shell. If you are using the CLI, install `jq` on your local machine. + ```console + gtw01.sh | jq + ``` + + The data returned is similar to: + + ```console + { + "Headers": { + "host": [ + "localhost", + "ctr6kqbjpza5tjnzafaqpqif5i.apigateway.us-phoenix-1.oci.customer-oci.com" + ], + "user-agent": [ + "lua-resty-http/0.14 (Lua) ngx_lua/10015", + "curl/7.64.1" + ], + "transfer-encoding": "chunked", + "content-type": [ + "application/octet-stream", + "application/octet-stream" + ], + "date": "Thu, 10 Dec 2020 01:35:43 GMT", + "fn-call-id": "01ES54MAKK1BT0H50ZJ00NGX00", + "fn-deadline": "2020-12-10T01:36:13Z", + "accept": "*/*", + "cdn-loop": "iQPgvPk4HZ74L-PRJqYw7A", + "forwarded": "for=73.34.74.159", + "x-forwarded-for": "73.34.74.159", + "x-real-ip": "73.34.74.159", + "fn-http-method": "GET", + "fn-http-request-url": "/v1/http-info", + "fn-intent": "httprequest", + "fn-invoke-type": "sync", + "oci-subject-id": "ocid1.apigateway.oc1.phx.0000000000000000000000000000000000000000000000000000", + "oci-subject-tenancy-id": "ocid1.tenancy.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "oci-subject-type": "resource", + "opc-request-id": "/A79EAB4A240E93EB226366B190A494BC/01ES54MAK21BT0H50ZJ00NGWZZ", + "x-content-sha256": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", + "accept-encoding": "gzip" + }, + "Configuration": { + "PATH": "/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "HOSTNAME": "7747cc436a14", + "FN_LISTENER": "unix:/tmp/iofs/lsnr.sock", + "FN_CPUS": "125m", + "FN_LOGFRAME_NAME": "01ES54E5RN00000000000001JF", + "FN_LOGFRAME_HDR": "Opc-Request-Id", + "FN_FORMAT": "http-stream", + "DB-NAME": "your-db-name", + "DB-USER": "your-user-name", + "FN_APP_ID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FN_FN_ID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FN_MEMORY": "256", + "FN_TYPE": "sync", + "OCI_RESOURCE_PRINCIPAL_RPST": "/.oci-credentials/rpst", + "OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM": "/.oci-credentials/private.pem", + "OCI_RESOURCE_PRINCIPAL_VERSION": "2.2", + "OCI_RESOURCE_PRINCIPAL_REGION": "us-phoenix-1", + "OCI_REGION_METADATA": "{\"realmDomainComponent\":\"oraclecloud.com\",\"realmKey\":\"oc1\",\"regionIdentifier\":\"us-phoenix-1\",\"regionKey\":\"PHX\"}", + "LANG": "C.UTF-8", + "GPG_KEY": "E3FF2839C048B25C084DEBE9B26995E310250568", + "PYTHON_VERSION": "3.8.5", + "PYTHON_PIP_VERSION": "20.2.2", + "PYTHON_GET_PIP_URL": "https://github.com/pypa/get-pip/raw/5578af97f8b2b466f4cdbebe18a3ba2d48ad1434/get-pip.py", + "PYTHON_GET_PIP_SHA256": "d4d62a0850fe0c2e6325b2cc20d818c580563de5a2038f917e3cb0e25280b4d1", + "PYTHONPATH": "/function:/python", + "HOME": "/home/fn" + }, + "Request body": {}, + "Request URL": "/v1/http-info", + "Query String": {}, + "Request Method": "GET", + "AppID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FnID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "CallID": "01ES54MAKK1BT0H50ZJ00NGX00", + "Format": "http-stream", + "Deadline": "2020-12-10T01:36:13Z" + } + ``` + + Notice all the Functions data returned in the second half of the response including: `AppID`, `FnID`, and `Format`. In addition, in the `Configuration` section you see the Functions-generated environment variables like `FN_FORMAT` and the configuration variables: `DB-NAME` and `DB-USER`. + +4. Update your script to pass headers and `POST` data to the script. + + ```console + /bin/bash + curl -X POST --header "X-MyHeader1: headerValue" -d '{"key1":"value"}' https://aaaaa.apigateway.us-ashburn-X.oci.customer-oic.com/v1/http-info + ``` + + The output from the script looks similar to: + + ```console + { + "Headers": { + "host": [ + "localhost", + "ctr6kqbjpza5tjnzafaqpqif5i.apigateway.us-phoenix-1.oci.customer-oci.com" + ], + "user-agent": [ + "lua-resty-http/0.14 (Lua) ngx_lua/10015", + "curl/7.64.1" + ], + "transfer-encoding": "chunked", + "content-type": [ + "application/x-www-form-urlencoded", + "application/x-www-form-urlencoded" + ], + "date": "Thu, 10 Dec 2020 17:05:14 GMT", + "fn-call-id": "000000000000000000000000000", + "fn-deadline": "2020-12-10T17:05:44Z", + "accept": "*/*", + "cdn-loop": "iQPgvPk4HZ74L-PRJqYw7A", + "content-length": "16", + "forwarded": "for=73.34.74.159", + "x-forwarded-for": "73.34.74.159", + "x-myheader1": "headerValue", + "x-real-ip": "73.34.74.159", + "fn-http-method": "POST", + "fn-http-request-url": "/v1/http-info", + "fn-intent": "httprequest", + "fn-invoke-type": "sync", + "oci-subject-id": "ocid1.apigateway.oc1.phx.0000000000000000000000000000000000000000000000000000", + "oci-subject-tenancy-id": "ocid1.tenancy.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "oci-subject-type": "resource", + "opc-request-id": "/32DE93ED4A72B932E62460362A24DA40/01ES6STAH91BT0G48ZJ00J07ZT", + "x-content-sha256": "xMAO2Qww/EVSr1CsSxtHsZu9VicSjb2EMvMmDMjZcVA=", + "accept-encoding": "gzip" + }, + "Configuration": { + "PATH": "/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "HOSTNAME": "1afb03686740", + "FN_LISTENER": "unix:/tmp/iofs/lsnr.sock", + "FN_CPUS": "125m", + "FN_APP_ID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FN_FN_ID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FN_MEMORY": "256", + "FN_TYPE": "sync", + "FN_FORMAT": "http-stream", + "DB-NAME": "your-db-name", + "DB-USER": "your-user-name", + "FN_LOGFRAME_NAME": "01ES6SSJY600000000000000BF", + "FN_LOGFRAME_HDR": "Opc-Request-Id", + "OCI_RESOURCE_PRINCIPAL_RPST": "/.oci-credentials/rpst", + "OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM": "/.oci-credentials/private.pem", + "OCI_RESOURCE_PRINCIPAL_VERSION": "2.2", + "OCI_RESOURCE_PRINCIPAL_REGION": "us-phoenix-1", + "OCI_REGION_METADATA": "{\"realmDomainComponent\":\"oraclecloud.com\",\"realmKey\":\"oc1\",\"regionIdentifier\":\"us-phoenix-1\",\"regionKey\":\"PHX\"}", + "LANG": "C.UTF-8", + "GPG_KEY": "E3FF2839C048B25C084DEBE9B26995E310250568", + "PYTHON_VERSION": "3.8.5", + "PYTHON_PIP_VERSION": "20.2.2", + "PYTHON_GET_PIP_URL": "https://github.com/pypa/get-pip/raw/5578af97f8b2b466f4cdbebe18a3ba2d48ad1434/get-pip.py", + "PYTHON_GET_PIP_SHA256": "d4d62a0850fe0c2e6325b2cc20d818c580563de5a2038f917e3cb0e25280b4d1", + "PYTHONPATH": "/function:/python", + "HOME": "/home/fn" + }, + "Request body": { + "key1": "value" + }, + "Request URL": "/v1/http-info", + "Query String": {}, + "Request Method": "POST", + "AppID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FnID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "CallID": "000000000000000000000000000", + "Format": "http-stream", + "Deadline": "2020-12-10T17:05:44Z" + } + ``` + + Note the header data and the request body data. The key/value JSON data is listed under the "Request Body" section. You can download the complete source code for the function from the [Oracle Function Samples site here](https://github.com/oracle/oracle-functions-samples/tree/master/samples/oci-apigw-display-httprequest-info-python). + +Congratulations! You have converted the boiler plate Python function into a new function that returns HTTP and Oracle Function data. The function demonstrates how data can be passed to API Gateway and processed in a function. + +## What's Next + +You have successfully created an API Gateway and called a function from it. You updated the function to display HTTP and Oracle Function data. + +To explore more information about development with Oracle products, check out these sites: + +* [Oracle Developers Portal](https://developer.oracle.com/) +* [Oracle Cloud Infrastructure](https://www.oracle.com/cloud/) +* [Oracle Functions](https://docs.oracle.com/iaas/Content/Functions/Concepts/functionsoverview.htm) +* [Oracle API Gateway](https://docs.oracle.com/iaas/Content/APIGateway/Concepts/apigatewayoverview.htm) + {% endslides %} \ No newline at end of file From bdc56d371ad28bf26ab041c5932c528db6e9c7b3 Mon Sep 17 00:00:00 2001 From: Victor Agreda Jr Date: Wed, 3 Nov 2021 14:23:03 -0400 Subject: [PATCH 2/4] Installing Jupyter on OCI from github, no thumbnail --- install-jupyterlab-oci-tutorial.md | 189 +++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 install-jupyterlab-oci-tutorial.md diff --git a/install-jupyterlab-oci-tutorial.md b/install-jupyterlab-oci-tutorial.md new file mode 100644 index 0000000..ac60834 --- /dev/null +++ b/install-jupyterlab-oci-tutorial.md @@ -0,0 +1,189 @@ +--- +layout: collection +title: How to install Jupyterlab in Oracle Cloud (OCI) +description: Setting up Jupyterlab to run on Oracle Cloud Infrastructure. +thumbnail: RELATIVE_PATH_TO_THUMBNAIL_IMAGE +tags: [python, linux, oci, jupyter] +sort: desc +date: 2021-11-05 12:01 +author: + name: operard + github: https://github.com/operard +categories: [clouddev] +parent: tutorials +--- + +The following walk-through guides you through the steps needed to set up your environment to run Jupyterlab in Oracle Cloud Infrastructure. + +## Prerequisites + +You have deployed a VM 2.1 with Oracle Linux 7.9 (OEL7) in Oracle Cloud Infrastructure (OCI). + +* The installation of Oracle Linux 7.9 is using pip3.6 by default. +* Python 3.6 or higher is installed +* You have access to root either directly or via sudo. By default in OCI, you are connected like "opc" user with sudo privilege. + +## Jupyterlab Installation + +The install is pretty simple. It consists of setting up python, installing python components and libraries. Lets start with setting up the Python Environment + +### Python Setup + +By default, OEL7 runs Python 3. The first is to install pip and virtualenv. + +#### Install virtualenv + +The next step is to install virtualenv. Virtualenv enables us to create isolated sandpits to develop Python applications without running into module or library conflicts. It's very simple to install +```console + sudo pip3.6 install virtualenv +``` + +Next we can create a virtual environment and enable it. + +#### Create an environment "myvirtualenv" +```console + virtualenv -p /usr/bin/python3 myvirtualenv + # Activate the env + source myvirtualenv/bin/activate +``` + +#### Check list of Python Libraries in your environment + +Running the following command will show what Python models we have installed at this point. + + (myvirtualenv) [opc@lab1 ~]$ pip3 list + Package Version + ---------- ------- + pip 21.1.3 + setuptools 57.1.0 + wheel 0.36.2 + WARNING: You are using pip version 21.1.3; however, version 21.2.1 is available. + You should consider upgrading via the '/home/opc/myvirtualenv/bin/python -m pip install --upgrade pip' command. + +#### Upgrade your PIP Environment for this virtual environment + +```console + /home/opc/myvirtualenv/bin/python -m pip install --upgrade pip +``` + +### Jupyterlab Setup + +```console + pip3 install jupyterlab +``` + +#### Install Python Libraries for Machine Learning or ETL Process + +```console + pip install pandas + pip install pandarallel + pip install dask + pip install seaborn + pip install matplotlib + pip install plotly + + pip install -lxml==4.6.3 + pip install selenium + pip install beautifulsoup4 + + pip install scikit-learn +``` + +#### Install other Python Libraries for Kafka Access and WEB Server Access + +```console + pip install kafka-python (v2.0.0) + pip install Flask + pip install gunicorn +``` + +#### Install extensiones for Jupyterlab Environment + +```console + pip install jupyter_contrib_nbextensions + jupyter contrib nbextension install --user + jupyter nbextension enable execute_time/ExecuteTime +``` + +## Configure Jupyterlab like a OEL7 Linux Service + +Create a script to instantiate automatically and reboot jupyterlab with "opc" user. +```console + vi /home/opc/launchjupyterlab.sh +``` + +### Script for launchjupyterlab.sh + +You must use the virtualenv created and you can launch Jupyterlab in a specific port (for example: 8001) and listen on public IP. + +```console + #!/bin/bash + + # Activate myvirtualenv Environment + source myvirtualenv/bin/activate + + cd /home/opc + + if [ "$1" = "start" ] + then + nohup jupyter-lab --ip=0.0.0.0 --port=8001 > ./nohup.log 2>&1 & + echo $! > /home/opc/jupyter.pid + else + kill $(cat /home/opc/jupyter.pid) + fi +``` + +We must put the script in executable mode in order to be executed from jupyterlab service. +```console + chmod 777 /home/opc/launchjupyterlab.sh +``` + +### Connect to "root" user + +```console + sudo -i +``` + +### Create a script to start, stop service "jupyterlab" +```console + vi /etc/systemd/system/jupyterlab.service +``` + +### Add next lines to launch like "opc" user the script "launchjupyterlab.sh" +```console + [Unit] + Description=Service to start jupyterlab for opc + Documentation= + [Service] + User=opc + Group=opc + Type=forking + WorkingDirectory=/home/opc + ExecStart=/home/opc/launchjupyterlab.sh start + ExecStop=/home/opc/launchjupyterlab.sh stop + [Install] + WantedBy=multi-user.target +``` + +### Test Jupyterlab Service +```console + systemctl start jupyterlab + systemctl status jupyterlab + systemctl enable jupyterlab +``` + +## Reboot Your machine to final check + +Now, you must reboot your machine to check if jupyterlab script is enabled by default on port defined 8001. + +You must open port 8001 to your virtual machine VM 2.1 in order to access using your Public IP. +```console + firewall-cmd --permanent --zone=public --list-ports + firewall-cmd --get-active-zones + firewall-cmd --permanent --zone=public --add-port=8001/tcp + firewall-cmd --reload +``` + +If you're running directly on a virtual machine and have a browser installed it should take you directly into the jupyter environment. Connect to your "[http://xxx.xxx.xxx.xxx:8001/](http://xxx.xxx.xxx.xxx:8001/)". + +And you should see the next Python Web environment "Jupyterlab". From 6780e0b1197e3e3b0ddd63912d681b87174d8265 Mon Sep 17 00:00:00 2001 From: Victor Agreda Jr Date: Wed, 3 Nov 2021 14:31:56 -0400 Subject: [PATCH 3/4] deleting redundant file --- install-jupyter-lab-on-oci.md | 205 ---------------------------------- 1 file changed, 205 deletions(-) delete mode 100644 install-jupyter-lab-on-oci.md diff --git a/install-jupyter-lab-on-oci.md b/install-jupyter-lab-on-oci.md deleted file mode 100644 index 5f0b091..0000000 --- a/install-jupyter-lab-on-oci.md +++ /dev/null @@ -1,205 +0,0 @@ ---- -title: Install Jupyter Lab in OCI -parent: tutorials -tags: -- oci -- get-started -- jupyter -- python -- data-science -- machine-learning -- open-source -categories: -- ai-ml -description: This tutorial will guide you through setting up your environment to run - Jupyter Lab on Oracle Cloud Infrastructure. -date: 2021-10-07 14:27 -redirect_from: "/collections/tutorials/install-jupyter-lab-on-oci/" ---- -{% slides %} - -This tutorial will guide you through setting up your environment to run Jupyter Lab on Oracle Cloud Infrastructure. - -## Prerequisites - -You'll need a Virtual Machine 2.1 with Oracle Linux 7.9 (OEL7) deployed in Oracle Cloud Infrastructure (OCI). - -- Oracle Linux 7.9 using pip3.6 by default. -- Python 3.6 or higher installed -- Access to root, either directly or via sudo. By default in OCI, you are connected as the "opc" user with sudo privilege. - -The install is pretty simple. It consists of setting up python and installing python components and libraries. - -Lets start with setting up the Python Environment - -## Python Setup - -By default, OEL7 runs Python 3. The first step is to install `pip` and `virtualenv`. - -1. Install `virtualenv` - - Virtualenv enables us to create isolated sandboxes for developing Python applications without running into module or library conflicts. It's very simple to install: - - ```console - sudo pip3.6 install virtualenv - ``` - -2. Next we can create a virtual environment called "myvirtualenv" - - ```console - virtualenv -p /usr/bin/python3 myvirtualenv - # Activate the env - source myvirtualenv/bin/activate - ``` - -3. Check list of Python Libraries in your environment - - Running the following command will show what Python models we have installed at this point. - - ```console - (myvirtualenv)$ pip3 list - Package Version - ---------- ------- - pip 21.1.3 - setuptools 57.1.0 - wheel 0.36.2 - WARNING: You are using pip version 21.1.3; however, version 21.2.1 is available. - You should consider upgrading via the '/home/opc/myvirtualenv/bin/python -m pip install --upgrade pip' command. - ``` - -4. Upgrade your PIP Environment for this virtual environment: - - ```console - /home/opc/myvirtualenv/bin/python -m pip install --upgrade pip - ``` - -## Jupyter Lab Setup - -1. Use `pip` to install Jupyter Lab: - - ```console - pip3 install jupyterlab - ``` - -2. Install Python Libraries for Machine Learning or ETL Process: - - ```console - pip install pandas - pip install pandarallel - pip install dask - pip install seaborn - pip install matplotlib - pip install plotly - - pip install -lxml==4.6.3 - pip install selenium - pip install beautifulsoup4 - - pip install scikit-learn - ``` - -3. Install other Python libraries for Kafka Access and WEB Server Access: - - ```console - pip install kafka-python (v2.0.0) - pip install Flask - pip install gunicorn - ``` - -4. Install extensions for Jupyter Lab environment: - - ```console - pip install jupyter_contrib_nbextensions - jupyter contrib nbextension install --user - jupyter nbextension enable execute_time/ExecuteTime - ``` - -## Configure Jupyter Lab like an OEL7 Linux Service - -1. Create a script to instantiate automatically and reboot jupyterlab with the `opc` user. - - ```console - vi /home/opc/launchjupyterlab.sh - ``` - -2. Add the contents below to `launchjupyterlab.sh`. You must use the `virtualenv` you created, and you can launch Jupyter Lab on a specific port (for example: 8001) and listen on your VM's public IP. - - ```bash - #!/bin/bash - - # Activate myvirtualenv Environment - source myvirtualenv/bin/activate - - cd /home/opc - - if [ "$1" = "start" ]; then - nohup jupyter-lab --ip=0.0.0.0 --port=8001 > ./nohup.log 2>&1 & - echo $! > /home/opc/jupyter.pid - else - kill $(cat /home/opc/jupyter.pid) - fi - ``` - -3. Make the script executable so it can be run from the jupyterlab service: - - ```console - chmod 777 /home/opc/launchjupyterlab.sh - ``` - - -4. Connect to "root" user: - - ```console - sudo -i - ``` - -5. Create a script to start and stop the "jupyterlab" service: - - ```console - vi /etc/systemd/system/jupyterlab.service - ``` - - -6. Add the following to `jupyterlab.service`: - - ```console - [Unit] - Description=Service to start jupyterlab for opc - Documentation= - [Service] - User=opc - Group=opc - Type=forking - WorkingDirectory=/home/opc - ExecStart=/home/opc/launchjupyterlab.sh start - ExecStop=/home/opc/launchjupyterlab.sh stop - [Install] - WantedBy=multi-user.target - ``` - -7. Test the Jupyter Lab Service - - ```console - systemctl start jupyterlab - systemctl status jupyterlab - systemctl enable jupyterlab - ``` - -## Reboot your VM - -1. Reboot your machine to check if `jupyterlab` script is enabled by default on port we defined (8001). - -2. Open port 8001 to your virtual machine VM 2.1 so you can access Jupyter Lab using your Public IP. - - ```console - firewall-cmd --permanent --zone=public --list-ports - firewall-cmd --get-active-zones - firewall-cmd --permanent --zone=public --add-port=8001/tcp - firewall-cmd --reload - ``` - -3. If you're running directly on a virtual machine and have a browser installed, it should take you directly into the Jupyter environment. Connect to `http://xxx.xxx.xxx.xxx:8001/` (replacing `xxx` with your public IP). - -You should now see the Python Web environment "Jupyter Lab". - -{% endslides %} From c55df761ad41d3a34c09dba396e6948693d0a9de Mon Sep 17 00:00:00 2001 From: Victor Agreda Jr Date: Wed, 3 Nov 2021 14:53:33 -0400 Subject: [PATCH 4/4] Fixes made Updated code blocks and front matter, yet again removed duplicate Jupyterlab tutorial(?) --- call-a-function-api-oci-clouddev.md | 718 ++++++++++++++-------------- install-jupyterlab-oci-tutorial.md | 189 -------- 2 files changed, 358 insertions(+), 549 deletions(-) delete mode 100644 install-jupyterlab-oci-tutorial.md diff --git a/call-a-function-api-oci-clouddev.md b/call-a-function-api-oci-clouddev.md index 0fc8e61..1f52d83 100644 --- a/call-a-function-api-oci-clouddev.md +++ b/call-a-function-api-oci-clouddev.md @@ -1,10 +1,8 @@ --- -layout: collection title: Call a Function using API Gateway categories: [clouddev, cloudapps, enterprise] description: Using Oracle functions to process data via an Oracle API Gateway, and creating a python function to extract HTTP information. thumbnail: assets/call-a-func-oracle-funcs-api-gtw-diagram.png -sort: desc tags: [python, apigateway, oci] parent: tutorials date: 2021-11-5 12:01 @@ -68,9 +66,9 @@ To successfully perform this tutorial, you must have the following: **Oracle Cloud Shell** - * If you use Cloud Shell, the preceding list of software is already installed. +* If you use Cloud Shell, the preceding list of software is already installed. -## 1. Gather Required Information +## Gather Required Information Collect all the information you need to complete the tutorial. Copy the following information into your notepad. @@ -110,7 +108,7 @@ Ensure you have the following information written down for the tutorial. Open the navigation menu and click **Networking**, and then click **Virtual Cloud Networks**. From the list of networks, select your VCN. -## 2. Perform Required Configuration +## Perform Required Configuration Perform all the configuration you need for the tutorial. @@ -245,7 +243,7 @@ You have created a policy to allow API Gateway to use Functions. Returns: `{"message": "Hello Bob"}` -## 3. Create an API Gateway +## Create an API Gateway To call your function, create an API Gateway. @@ -304,35 +302,35 @@ With your API Gateway and deployment created, you can now test you installation. You have connected your API Gateway to a boiler plate Python function. Next, you update your Python function to display information passed in an HTTP request. -## 4. Update Function to Access HTTP and Function Data +## Update Function to Access HTTP and Function Data Next, modify the boiler plate Python function to access the runtime context and display HTTP information. ### Review Starting Python Code If you look at the boiler plate function, your Python function looks something like this. -```console - import io - import json - import logging - - from fdk import response - +```python +import io +import json +import logging + +from fdk import response + + +def handler(ctx, data: io.BytesIO = None): + name = "World" + try: + body = json.loads(data.getvalue()) + name = body.get("name") + except (Exception, ValueError) as ex: + logging.getLogger().info('error parsing json payload: ' + str(ex)) - def handler(ctx, data: io.BytesIO = None): - name = "World" - try: - body = json.loads(data.getvalue()) - name = body.get("name") - except (Exception, ValueError) as ex: - logging.getLogger().info('error parsing json payload: ' + str(ex)) - - logging.getLogger().info("Inside Python Hello World function") - return response.Response( - ctx, response_data=json.dumps( - {"message": "Hello {0}".format(name)}), - headers={"Content-Type": "application/json"} - ) + logging.getLogger().info("Inside Python Hello World function") + return response.Response( + ctx, response_data=json.dumps( + {"message": "Hello {0}".format(name)}), + headers={"Content-Type": "application/json"} + ) ``` Using this code as a starting point, the sections that follow convert the function into a Python function that returns HTTP and configuration data. @@ -344,19 +342,19 @@ First, update the function for required packages. 1. Update the `requirements.txt` file for the `oci` package. ```console - fdk - oci + fdk + oci ``` 2. Update the `import` statements in `func.py` for required packages for the HTTP features: - ```console - import io - import json - import oci - import logging - from urllib.parse import urlparse, parse_qs + ```python + import io + import json + import oci + import logging + from urllib.parse import urlparse, parse_qs ``` The `oci` package is required for some of the context requests. The `urlparse, parse_qs` packages are used for parsing. @@ -365,68 +363,68 @@ First, update the function for required packages. First, remove the main body of the function. The `response` method and related code are added back as we go. -```console - import io - import json - import oci - import logging - from urllib.parse import urlparse, parse_qs - - from fdk import response - - def handler(ctx, data: io.BytesIO = None): +```python +import io +import json +import oci +import logging +from urllib.parse import urlparse, parse_qs + +from fdk import response + +def handler(ctx, data: io.BytesIO = None): ``` Next add code to display HTTP information in the response. Here is the code with comments following. -```console - import io - import json - import oci - import logging - from urllib.parse import urlparse, parse_qs - - from fdk import response +```python +import io +import json +import oci +import logging +from urllib.parse import urlparse, parse_qs + +from fdk import response + +def handler(ctx, data: io.BytesIO = None): + logging.getLogger().info("HTTP function start") - def handler(ctx, data: io.BytesIO = None): - logging.getLogger().info("HTTP function start") - - resp = {} - - # retrieving the request headers - headers = ctx.Headers() - logging.getLogger().info("Headers: " + json.dumps(headers)) - resp["Headers"] = headers - - # retrieving the request body, e.g. {"key1":"value"} - try: - requestbody_str = data.getvalue().decode('UTF-8') - if requestbody_str: - resp["Request body"] = json.loads(requestbody_str) - else: - resp["Request body"] = {} - except Exception as ex: - print('ERROR: The request body is not JSON', ex, flush=True) - raise - - # retrieving the request URL, e.g. "/v1/http-info" - requesturl = ctx.RequestURL() - logging.getLogger().info("Request URL: " + json.dumps(requesturl)) - resp["Request URL"] = requesturl - - # retrieving query string from the request URL, e.g. {"param1":["value"]} - parsed_url = urlparse(requesturl) - resp["Query String"] = parse_qs(parsed_url.query) - logging.getLogger().info("Query string: " + json.dumps(resp["Query String"])) - - # retrieving the request method, e.g. "POST", "GET"... - method = ctx.Method() - if method: - logging.getLogger().info("Request Method: " + method) - resp["Request Method"] = method + resp = {} + + # retrieving the request headers + headers = ctx.Headers() + logging.getLogger().info("Headers: " + json.dumps(headers)) + resp["Headers"] = headers + + # retrieving the request body, e.g. {"key1":"value"} + try: + requestbody_str = data.getvalue().decode('UTF-8') + if requestbody_str: + resp["Request body"] = json.loads(requestbody_str) else: - logging.getLogger().info("No Request Method") - resp["Request Method"] = None + resp["Request body"] = {} + except Exception as ex: + print('ERROR: The request body is not JSON', ex, flush=True) + raise + + # retrieving the request URL, e.g. "/v1/http-info" + requesturl = ctx.RequestURL() + logging.getLogger().info("Request URL: " + json.dumps(requesturl)) + resp["Request URL"] = requesturl + + # retrieving query string from the request URL, e.g. {"param1":["value"]} + parsed_url = urlparse(requesturl) + resp["Query String"] = parse_qs(parsed_url.query) + logging.getLogger().info("Query string: " + json.dumps(resp["Query String"])) + + # retrieving the request method, e.g. "POST", "GET"... + method = ctx.Method() + if method: + logging.getLogger().info("Request Method: " + method) + resp["Request Method"] = method + else: + logging.getLogger().info("No Request Method") + resp["Request Method"] = None ``` * The `handler` function receives system information about the current request through the `ctx` and `data` parameters. @@ -438,42 +436,42 @@ Next add code to display HTTP information in the response. Here is the code with Next, retrieve Oracle Functions related data from the context and then return a response. Comments follow. -```console - # retrieving the function configuration - resp["Configuration"] = dict(ctx.Config()) - logging.getLogger().info("Configuration: " + json.dumps(resp["Configuration"])) - - # retrieving the Application ID, e.g. "ocid1.fnapp.oc1.phx.aaaaxxxx" - appid = ctx.AppID() - logging.getLogger().info("AppID: " + appid) - resp["AppID"] = appid - - # retrieving the Function ID, e.g. "ocid1.fnfunc.oc1.phx.aaaaxxxxx" - fnid = ctx.FnID() - logging.getLogger().info("FnID: " + fnid) - resp["FnID"] = fnid - - # retrieving the Function call ID, e.g. "01E9FE6JBW1BT0C68ZJ003KR1Q" - callid = ctx.CallID() - logging.getLogger().info("CallID: " + callid) - resp["CallID"] = callid - - # retrieving the Function format, e.g. "http-stream" - fnformat = ctx.Format() - logging.getLogger().info("Format: " + fnformat) - resp["Format"] = fnformat - - # retrieving the Function deadline, e.g. "2020-05-29T05:24:46Z" - deadline = ctx.Deadline() - logging.getLogger().info("Deadline: " + deadline) - resp["Deadline"] = deadline - - logging.getLogger().info("function handler end") - return response.Response( - ctx, - response_data=json.dumps(resp), - headers={"Content-Type": "application/json"} - ) +```python +# retrieving the function configuration +resp["Configuration"] = dict(ctx.Config()) +logging.getLogger().info("Configuration: " + json.dumps(resp["Configuration"])) + +# retrieving the Application ID, e.g. "ocid1.fnapp.oc1.phx.aaaaxxxx" +appid = ctx.AppID() +logging.getLogger().info("AppID: " + appid) +resp["AppID"] = appid + +# retrieving the Function ID, e.g. "ocid1.fnfunc.oc1.phx.aaaaxxxxx" +fnid = ctx.FnID() +logging.getLogger().info("FnID: " + fnid) +resp["FnID"] = fnid + +# retrieving the Function call ID, e.g. "01E9FE6JBW1BT0C68ZJ003KR1Q" +callid = ctx.CallID() +logging.getLogger().info("CallID: " + callid) +resp["CallID"] = callid + +# retrieving the Function format, e.g. "http-stream" +fnformat = ctx.Format() +logging.getLogger().info("Format: " + fnformat) +resp["Format"] = fnformat + +# retrieving the Function deadline, e.g. "2020-05-29T05:24:46Z" +deadline = ctx.Deadline() +logging.getLogger().info("Deadline: " + deadline) +resp["Deadline"] = deadline + +logging.getLogger().info("function handler end") +return response.Response( + ctx, + response_data=json.dumps(resp), + headers={"Content-Type": "application/json"} +) ``` Notice all the Functions-related data is retrieved from the `ctx` object including: `AppID`, `FnID`, and`Format`. @@ -482,90 +480,90 @@ Notice all the Functions-related data is retrieved from the `ctx` object includi Here is the final function code. -```console - import io - import json - import oci - import logging - from urllib.parse import urlparse, parse_qs +```python +import io +import json +import oci +import logging +from urllib.parse import urlparse, parse_qs + +from fdk import response + +def handler(ctx, data: io.BytesIO = None): + logging.getLogger().info("HTTP function start") - from fdk import response + resp = {} - def handler(ctx, data: io.BytesIO = None): - logging.getLogger().info("HTTP function start") - - resp = {} - - # retrieving the request headers - headers = ctx.Headers() - logging.getLogger().info("Headers: " + json.dumps(headers)) - resp["Headers"] = headers - - # retrieving the request body, e.g. {"key1":"value"} - try: - requestbody_str = data.getvalue().decode('UTF-8') - if requestbody_str: - resp["Request body"] = json.loads(requestbody_str) - else: - resp["Request body"] = {} - except Exception as ex: - print('ERROR: The request body is not JSON', ex, flush=True) - raise - - # retrieving the request URL, e.g. "/v1/http-info" - requesturl = ctx.RequestURL() - logging.getLogger().info("Request URL: " + json.dumps(requesturl)) - resp["Request URL"] = requesturl - - # retrieving query string from the request URL, e.g. {"param1":["value"]} - parsed_url = urlparse(requesturl) - resp["Query String"] = parse_qs(parsed_url.query) - logging.getLogger().info("Query string: " + json.dumps(resp["Query String"])) - - # retrieving the request method, e.g. "POST", "GET"... - method = ctx.Method() - if method: - logging.getLogger().info("Request Method: " + method) - resp["Request Method"] = method + # retrieving the request headers + headers = ctx.Headers() + logging.getLogger().info("Headers: " + json.dumps(headers)) + resp["Headers"] = headers + + # retrieving the request body, e.g. {"key1":"value"} + try: + requestbody_str = data.getvalue().decode('UTF-8') + if requestbody_str: + resp["Request body"] = json.loads(requestbody_str) else: - logging.getLogger().info("No Request Method") - resp["Request Method"] = None - - # retrieving the function configuration - resp["Configuration"] = dict(ctx.Config()) - logging.getLogger().info("Configuration: " + json.dumps(resp["Configuration"])) - - # retrieving the Application ID, e.g. "ocid1.fnapp.oc1.phx.aaaaxxxx" - appid = ctx.AppID() - logging.getLogger().info("AppID: " + appid) - resp["AppID"] = appid - - # retrieving the Function ID, e.g. "ocid1.fnfunc.oc1.phx.aaaaxxxxx" - fnid = ctx.FnID() - logging.getLogger().info("FnID: " + fnid) - resp["FnID"] = fnid - - # retrieving the Function call ID, e.g. "01E9FE6JBW1BT0C68ZJ003KR1Q" - callid = ctx.CallID() - logging.getLogger().info("CallID: " + callid) - resp["CallID"] = callid - - # retrieving the Function format, e.g. "http-stream" - fnformat = ctx.Format() - logging.getLogger().info("Format: " + fnformat) - resp["Format"] = fnformat - - # retrieving the Function deadline, e.g. "2020-05-29T05:24:46Z" - deadline = ctx.Deadline() - logging.getLogger().info("Deadline: " + deadline) - resp["Deadline"] = deadline - - logging.getLogger().info("function handler end") - return response.Response( - ctx, - response_data=json.dumps(resp), - headers={"Content-Type": "application/json"} - ) + resp["Request body"] = {} + except Exception as ex: + print('ERROR: The request body is not JSON', ex, flush=True) + raise + + # retrieving the request URL, e.g. "/v1/http-info" + requesturl = ctx.RequestURL() + logging.getLogger().info("Request URL: " + json.dumps(requesturl)) + resp["Request URL"] = requesturl + + # retrieving query string from the request URL, e.g. {"param1":["value"]} + parsed_url = urlparse(requesturl) + resp["Query String"] = parse_qs(parsed_url.query) + logging.getLogger().info("Query string: " + json.dumps(resp["Query String"])) + + # retrieving the request method, e.g. "POST", "GET"... + method = ctx.Method() + if method: + logging.getLogger().info("Request Method: " + method) + resp["Request Method"] = method + else: + logging.getLogger().info("No Request Method") + resp["Request Method"] = None + + # retrieving the function configuration + resp["Configuration"] = dict(ctx.Config()) + logging.getLogger().info("Configuration: " + json.dumps(resp["Configuration"])) + + # retrieving the Application ID, e.g. "ocid1.fnapp.oc1.phx.aaaaxxxx" + appid = ctx.AppID() + logging.getLogger().info("AppID: " + appid) + resp["AppID"] = appid + + # retrieving the Function ID, e.g. "ocid1.fnfunc.oc1.phx.aaaaxxxxx" + fnid = ctx.FnID() + logging.getLogger().info("FnID: " + fnid) + resp["FnID"] = fnid + + # retrieving the Function call ID, e.g. "01E9FE6JBW1BT0C68ZJ003KR1Q" + callid = ctx.CallID() + logging.getLogger().info("CallID: " + callid) + resp["CallID"] = callid + + # retrieving the Function format, e.g. "http-stream" + fnformat = ctx.Format() + logging.getLogger().info("Format: " + fnformat) + resp["Format"] = fnformat + + # retrieving the Function deadline, e.g. "2020-05-29T05:24:46Z" + deadline = ctx.Deadline() + logging.getLogger().info("Deadline: " + deadline) + resp["Deadline"] = deadline + + logging.getLogger().info("function handler end") + return response.Response( + ctx, + response_data=json.dumps(resp), + headers={"Content-Type": "application/json"} + ) ``` You are now ready to retest you function and see the results. @@ -585,84 +583,84 @@ For more information, see [Fn Project's tutorial on runtime context](https://fnp 2. Invoke the function to ensure that the function is working. 3. Run your script again. To get formatted JSON output, use the `jq` utility which is included with the cloud shell. If you are using the CLI, install `jq` on your local machine. ```console - gtw01.sh | jq + gtw01.sh | jq ``` The data returned is similar to: ```console - { - "Headers": { - "host": [ - "localhost", - "ctr6kqbjpza5tjnzafaqpqif5i.apigateway.us-phoenix-1.oci.customer-oci.com" - ], - "user-agent": [ - "lua-resty-http/0.14 (Lua) ngx_lua/10015", - "curl/7.64.1" - ], - "transfer-encoding": "chunked", - "content-type": [ - "application/octet-stream", - "application/octet-stream" - ], - "date": "Thu, 10 Dec 2020 01:35:43 GMT", - "fn-call-id": "01ES54MAKK1BT0H50ZJ00NGX00", - "fn-deadline": "2020-12-10T01:36:13Z", - "accept": "*/*", - "cdn-loop": "iQPgvPk4HZ74L-PRJqYw7A", - "forwarded": "for=73.34.74.159", - "x-forwarded-for": "73.34.74.159", - "x-real-ip": "73.34.74.159", - "fn-http-method": "GET", - "fn-http-request-url": "/v1/http-info", - "fn-intent": "httprequest", - "fn-invoke-type": "sync", - "oci-subject-id": "ocid1.apigateway.oc1.phx.0000000000000000000000000000000000000000000000000000", - "oci-subject-tenancy-id": "ocid1.tenancy.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "oci-subject-type": "resource", - "opc-request-id": "/A79EAB4A240E93EB226366B190A494BC/01ES54MAK21BT0H50ZJ00NGWZZ", - "x-content-sha256": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", - "accept-encoding": "gzip" - }, - "Configuration": { - "PATH": "/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "HOSTNAME": "7747cc436a14", - "FN_LISTENER": "unix:/tmp/iofs/lsnr.sock", - "FN_CPUS": "125m", - "FN_LOGFRAME_NAME": "01ES54E5RN00000000000001JF", - "FN_LOGFRAME_HDR": "Opc-Request-Id", - "FN_FORMAT": "http-stream", - "DB-NAME": "your-db-name", - "DB-USER": "your-user-name", - "FN_APP_ID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "FN_FN_ID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "FN_MEMORY": "256", - "FN_TYPE": "sync", - "OCI_RESOURCE_PRINCIPAL_RPST": "/.oci-credentials/rpst", - "OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM": "/.oci-credentials/private.pem", - "OCI_RESOURCE_PRINCIPAL_VERSION": "2.2", - "OCI_RESOURCE_PRINCIPAL_REGION": "us-phoenix-1", - "OCI_REGION_METADATA": "{\"realmDomainComponent\":\"oraclecloud.com\",\"realmKey\":\"oc1\",\"regionIdentifier\":\"us-phoenix-1\",\"regionKey\":\"PHX\"}", - "LANG": "C.UTF-8", - "GPG_KEY": "E3FF2839C048B25C084DEBE9B26995E310250568", - "PYTHON_VERSION": "3.8.5", - "PYTHON_PIP_VERSION": "20.2.2", - "PYTHON_GET_PIP_URL": "https://github.com/pypa/get-pip/raw/5578af97f8b2b466f4cdbebe18a3ba2d48ad1434/get-pip.py", - "PYTHON_GET_PIP_SHA256": "d4d62a0850fe0c2e6325b2cc20d818c580563de5a2038f917e3cb0e25280b4d1", - "PYTHONPATH": "/function:/python", - "HOME": "/home/fn" - }, - "Request body": {}, - "Request URL": "/v1/http-info", - "Query String": {}, - "Request Method": "GET", - "AppID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "FnID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "CallID": "01ES54MAKK1BT0H50ZJ00NGX00", - "Format": "http-stream", - "Deadline": "2020-12-10T01:36:13Z" - } + { + "Headers": { + "host": [ + "localhost", + "ctr6kqbjpza5tjnzafaqpqif5i.apigateway.us-phoenix-1.oci.customer-oci.com" + ], + "user-agent": [ + "lua-resty-http/0.14 (Lua) ngx_lua/10015", + "curl/7.64.1" + ], + "transfer-encoding": "chunked", + "content-type": [ + "application/octet-stream", + "application/octet-stream" + ], + "date": "Thu, 10 Dec 2020 01:35:43 GMT", + "fn-call-id": "01ES54MAKK1BT0H50ZJ00NGX00", + "fn-deadline": "2020-12-10T01:36:13Z", + "accept": "*/*", + "cdn-loop": "iQPgvPk4HZ74L-PRJqYw7A", + "forwarded": "for=73.34.74.159", + "x-forwarded-for": "73.34.74.159", + "x-real-ip": "73.34.74.159", + "fn-http-method": "GET", + "fn-http-request-url": "/v1/http-info", + "fn-intent": "httprequest", + "fn-invoke-type": "sync", + "oci-subject-id": "ocid1.apigateway.oc1.phx.0000000000000000000000000000000000000000000000000000", + "oci-subject-tenancy-id": "ocid1.tenancy.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "oci-subject-type": "resource", + "opc-request-id": "/A79EAB4A240E93EB226366B190A494BC/01ES54MAK21BT0H50ZJ00NGWZZ", + "x-content-sha256": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", + "accept-encoding": "gzip" + }, + "Configuration": { + "PATH": "/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "HOSTNAME": "7747cc436a14", + "FN_LISTENER": "unix:/tmp/iofs/lsnr.sock", + "FN_CPUS": "125m", + "FN_LOGFRAME_NAME": "01ES54E5RN00000000000001JF", + "FN_LOGFRAME_HDR": "Opc-Request-Id", + "FN_FORMAT": "http-stream", + "DB-NAME": "your-db-name", + "DB-USER": "your-user-name", + "FN_APP_ID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FN_FN_ID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FN_MEMORY": "256", + "FN_TYPE": "sync", + "OCI_RESOURCE_PRINCIPAL_RPST": "/.oci-credentials/rpst", + "OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM": "/.oci-credentials/private.pem", + "OCI_RESOURCE_PRINCIPAL_VERSION": "2.2", + "OCI_RESOURCE_PRINCIPAL_REGION": "us-phoenix-1", + "OCI_REGION_METADATA": "{\"realmDomainComponent\":\"oraclecloud.com\",\"realmKey\":\"oc1\",\"regionIdentifier\":\"us-phoenix-1\",\"regionKey\":\"PHX\"}", + "LANG": "C.UTF-8", + "GPG_KEY": "E3FF2839C048B25C084DEBE9B26995E310250568", + "PYTHON_VERSION": "3.8.5", + "PYTHON_PIP_VERSION": "20.2.2", + "PYTHON_GET_PIP_URL": "https://github.com/pypa/get-pip/raw/5578af97f8b2b466f4cdbebe18a3ba2d48ad1434/get-pip.py", + "PYTHON_GET_PIP_SHA256": "d4d62a0850fe0c2e6325b2cc20d818c580563de5a2038f917e3cb0e25280b4d1", + "PYTHONPATH": "/function:/python", + "HOME": "/home/fn" + }, + "Request body": {}, + "Request URL": "/v1/http-info", + "Query String": {}, + "Request Method": "GET", + "AppID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FnID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "CallID": "01ES54MAKK1BT0H50ZJ00NGX00", + "Format": "http-stream", + "Deadline": "2020-12-10T01:36:13Z" + } ``` Notice all the Functions data returned in the second half of the response including: `AppID`, `FnID`, and `Format`. In addition, in the `Configuration` section you see the Functions-generated environment variables like `FN_FORMAT` and the configuration variables: `DB-NAME` and `DB-USER`. @@ -670,89 +668,89 @@ For more information, see [Fn Project's tutorial on runtime context](https://fnp 4. Update your script to pass headers and `POST` data to the script. ```console - /bin/bash - curl -X POST --header "X-MyHeader1: headerValue" -d '{"key1":"value"}' https://aaaaa.apigateway.us-ashburn-X.oci.customer-oic.com/v1/http-info + /bin/bash + curl -X POST --header "X-MyHeader1: headerValue" -d '{"key1":"value"}' https://aaaaa.apigateway.us-ashburn-X.oci.customer-oic.com/v1/http-info ``` The output from the script looks similar to: ```console - { - "Headers": { - "host": [ - "localhost", - "ctr6kqbjpza5tjnzafaqpqif5i.apigateway.us-phoenix-1.oci.customer-oci.com" - ], - "user-agent": [ - "lua-resty-http/0.14 (Lua) ngx_lua/10015", - "curl/7.64.1" - ], - "transfer-encoding": "chunked", - "content-type": [ - "application/x-www-form-urlencoded", - "application/x-www-form-urlencoded" - ], - "date": "Thu, 10 Dec 2020 17:05:14 GMT", - "fn-call-id": "000000000000000000000000000", - "fn-deadline": "2020-12-10T17:05:44Z", - "accept": "*/*", - "cdn-loop": "iQPgvPk4HZ74L-PRJqYw7A", - "content-length": "16", - "forwarded": "for=73.34.74.159", - "x-forwarded-for": "73.34.74.159", - "x-myheader1": "headerValue", - "x-real-ip": "73.34.74.159", - "fn-http-method": "POST", - "fn-http-request-url": "/v1/http-info", - "fn-intent": "httprequest", - "fn-invoke-type": "sync", - "oci-subject-id": "ocid1.apigateway.oc1.phx.0000000000000000000000000000000000000000000000000000", - "oci-subject-tenancy-id": "ocid1.tenancy.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "oci-subject-type": "resource", - "opc-request-id": "/32DE93ED4A72B932E62460362A24DA40/01ES6STAH91BT0G48ZJ00J07ZT", - "x-content-sha256": "xMAO2Qww/EVSr1CsSxtHsZu9VicSjb2EMvMmDMjZcVA=", - "accept-encoding": "gzip" - }, - "Configuration": { - "PATH": "/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "HOSTNAME": "1afb03686740", - "FN_LISTENER": "unix:/tmp/iofs/lsnr.sock", - "FN_CPUS": "125m", - "FN_APP_ID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "FN_FN_ID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "FN_MEMORY": "256", - "FN_TYPE": "sync", - "FN_FORMAT": "http-stream", - "DB-NAME": "your-db-name", - "DB-USER": "your-user-name", - "FN_LOGFRAME_NAME": "01ES6SSJY600000000000000BF", - "FN_LOGFRAME_HDR": "Opc-Request-Id", - "OCI_RESOURCE_PRINCIPAL_RPST": "/.oci-credentials/rpst", - "OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM": "/.oci-credentials/private.pem", - "OCI_RESOURCE_PRINCIPAL_VERSION": "2.2", - "OCI_RESOURCE_PRINCIPAL_REGION": "us-phoenix-1", - "OCI_REGION_METADATA": "{\"realmDomainComponent\":\"oraclecloud.com\",\"realmKey\":\"oc1\",\"regionIdentifier\":\"us-phoenix-1\",\"regionKey\":\"PHX\"}", - "LANG": "C.UTF-8", - "GPG_KEY": "E3FF2839C048B25C084DEBE9B26995E310250568", - "PYTHON_VERSION": "3.8.5", - "PYTHON_PIP_VERSION": "20.2.2", - "PYTHON_GET_PIP_URL": "https://github.com/pypa/get-pip/raw/5578af97f8b2b466f4cdbebe18a3ba2d48ad1434/get-pip.py", - "PYTHON_GET_PIP_SHA256": "d4d62a0850fe0c2e6325b2cc20d818c580563de5a2038f917e3cb0e25280b4d1", - "PYTHONPATH": "/function:/python", - "HOME": "/home/fn" - }, - "Request body": { - "key1": "value" - }, - "Request URL": "/v1/http-info", - "Query String": {}, - "Request Method": "POST", - "AppID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "FnID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "CallID": "000000000000000000000000000", - "Format": "http-stream", - "Deadline": "2020-12-10T17:05:44Z" - } + { + "Headers": { + "host": [ + "localhost", + "ctr6kqbjpza5tjnzafaqpqif5i.apigateway.us-phoenix-1.oci.customer-oci.com" + ], + "user-agent": [ + "lua-resty-http/0.14 (Lua) ngx_lua/10015", + "curl/7.64.1" + ], + "transfer-encoding": "chunked", + "content-type": [ + "application/x-www-form-urlencoded", + "application/x-www-form-urlencoded" + ], + "date": "Thu, 10 Dec 2020 17:05:14 GMT", + "fn-call-id": "000000000000000000000000000", + "fn-deadline": "2020-12-10T17:05:44Z", + "accept": "*/*", + "cdn-loop": "iQPgvPk4HZ74L-PRJqYw7A", + "content-length": "16", + "forwarded": "for=73.34.74.159", + "x-forwarded-for": "73.34.74.159", + "x-myheader1": "headerValue", + "x-real-ip": "73.34.74.159", + "fn-http-method": "POST", + "fn-http-request-url": "/v1/http-info", + "fn-intent": "httprequest", + "fn-invoke-type": "sync", + "oci-subject-id": "ocid1.apigateway.oc1.phx.0000000000000000000000000000000000000000000000000000", + "oci-subject-tenancy-id": "ocid1.tenancy.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "oci-subject-type": "resource", + "opc-request-id": "/32DE93ED4A72B932E62460362A24DA40/01ES6STAH91BT0G48ZJ00J07ZT", + "x-content-sha256": "xMAO2Qww/EVSr1CsSxtHsZu9VicSjb2EMvMmDMjZcVA=", + "accept-encoding": "gzip" + }, + "Configuration": { + "PATH": "/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "HOSTNAME": "1afb03686740", + "FN_LISTENER": "unix:/tmp/iofs/lsnr.sock", + "FN_CPUS": "125m", + "FN_APP_ID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FN_FN_ID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FN_MEMORY": "256", + "FN_TYPE": "sync", + "FN_FORMAT": "http-stream", + "DB-NAME": "your-db-name", + "DB-USER": "your-user-name", + "FN_LOGFRAME_NAME": "01ES6SSJY600000000000000BF", + "FN_LOGFRAME_HDR": "Opc-Request-Id", + "OCI_RESOURCE_PRINCIPAL_RPST": "/.oci-credentials/rpst", + "OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM": "/.oci-credentials/private.pem", + "OCI_RESOURCE_PRINCIPAL_VERSION": "2.2", + "OCI_RESOURCE_PRINCIPAL_REGION": "us-phoenix-1", + "OCI_REGION_METADATA": "{\"realmDomainComponent\":\"oraclecloud.com\",\"realmKey\":\"oc1\",\"regionIdentifier\":\"us-phoenix-1\",\"regionKey\":\"PHX\"}", + "LANG": "C.UTF-8", + "GPG_KEY": "E3FF2839C048B25C084DEBE9B26995E310250568", + "PYTHON_VERSION": "3.8.5", + "PYTHON_PIP_VERSION": "20.2.2", + "PYTHON_GET_PIP_URL": "https://github.com/pypa/get-pip/raw/5578af97f8b2b466f4cdbebe18a3ba2d48ad1434/get-pip.py", + "PYTHON_GET_PIP_SHA256": "d4d62a0850fe0c2e6325b2cc20d818c580563de5a2038f917e3cb0e25280b4d1", + "PYTHONPATH": "/function:/python", + "HOME": "/home/fn" + }, + "Request body": { + "key1": "value" + }, + "Request URL": "/v1/http-info", + "Query String": {}, + "Request Method": "POST", + "AppID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "FnID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "CallID": "000000000000000000000000000", + "Format": "http-stream", + "Deadline": "2020-12-10T17:05:44Z" + } ``` Note the header data and the request body data. The key/value JSON data is listed under the "Request Body" section. You can download the complete source code for the function from the [Oracle Function Samples site here](https://github.com/oracle/oracle-functions-samples/tree/master/samples/oci-apigw-display-httprequest-info-python). diff --git a/install-jupyterlab-oci-tutorial.md b/install-jupyterlab-oci-tutorial.md deleted file mode 100644 index ac60834..0000000 --- a/install-jupyterlab-oci-tutorial.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -layout: collection -title: How to install Jupyterlab in Oracle Cloud (OCI) -description: Setting up Jupyterlab to run on Oracle Cloud Infrastructure. -thumbnail: RELATIVE_PATH_TO_THUMBNAIL_IMAGE -tags: [python, linux, oci, jupyter] -sort: desc -date: 2021-11-05 12:01 -author: - name: operard - github: https://github.com/operard -categories: [clouddev] -parent: tutorials ---- - -The following walk-through guides you through the steps needed to set up your environment to run Jupyterlab in Oracle Cloud Infrastructure. - -## Prerequisites - -You have deployed a VM 2.1 with Oracle Linux 7.9 (OEL7) in Oracle Cloud Infrastructure (OCI). - -* The installation of Oracle Linux 7.9 is using pip3.6 by default. -* Python 3.6 or higher is installed -* You have access to root either directly or via sudo. By default in OCI, you are connected like "opc" user with sudo privilege. - -## Jupyterlab Installation - -The install is pretty simple. It consists of setting up python, installing python components and libraries. Lets start with setting up the Python Environment - -### Python Setup - -By default, OEL7 runs Python 3. The first is to install pip and virtualenv. - -#### Install virtualenv - -The next step is to install virtualenv. Virtualenv enables us to create isolated sandpits to develop Python applications without running into module or library conflicts. It's very simple to install -```console - sudo pip3.6 install virtualenv -``` - -Next we can create a virtual environment and enable it. - -#### Create an environment "myvirtualenv" -```console - virtualenv -p /usr/bin/python3 myvirtualenv - # Activate the env - source myvirtualenv/bin/activate -``` - -#### Check list of Python Libraries in your environment - -Running the following command will show what Python models we have installed at this point. - - (myvirtualenv) [opc@lab1 ~]$ pip3 list - Package Version - ---------- ------- - pip 21.1.3 - setuptools 57.1.0 - wheel 0.36.2 - WARNING: You are using pip version 21.1.3; however, version 21.2.1 is available. - You should consider upgrading via the '/home/opc/myvirtualenv/bin/python -m pip install --upgrade pip' command. - -#### Upgrade your PIP Environment for this virtual environment - -```console - /home/opc/myvirtualenv/bin/python -m pip install --upgrade pip -``` - -### Jupyterlab Setup - -```console - pip3 install jupyterlab -``` - -#### Install Python Libraries for Machine Learning or ETL Process - -```console - pip install pandas - pip install pandarallel - pip install dask - pip install seaborn - pip install matplotlib - pip install plotly - - pip install -lxml==4.6.3 - pip install selenium - pip install beautifulsoup4 - - pip install scikit-learn -``` - -#### Install other Python Libraries for Kafka Access and WEB Server Access - -```console - pip install kafka-python (v2.0.0) - pip install Flask - pip install gunicorn -``` - -#### Install extensiones for Jupyterlab Environment - -```console - pip install jupyter_contrib_nbextensions - jupyter contrib nbextension install --user - jupyter nbextension enable execute_time/ExecuteTime -``` - -## Configure Jupyterlab like a OEL7 Linux Service - -Create a script to instantiate automatically and reboot jupyterlab with "opc" user. -```console - vi /home/opc/launchjupyterlab.sh -``` - -### Script for launchjupyterlab.sh - -You must use the virtualenv created and you can launch Jupyterlab in a specific port (for example: 8001) and listen on public IP. - -```console - #!/bin/bash - - # Activate myvirtualenv Environment - source myvirtualenv/bin/activate - - cd /home/opc - - if [ "$1" = "start" ] - then - nohup jupyter-lab --ip=0.0.0.0 --port=8001 > ./nohup.log 2>&1 & - echo $! > /home/opc/jupyter.pid - else - kill $(cat /home/opc/jupyter.pid) - fi -``` - -We must put the script in executable mode in order to be executed from jupyterlab service. -```console - chmod 777 /home/opc/launchjupyterlab.sh -``` - -### Connect to "root" user - -```console - sudo -i -``` - -### Create a script to start, stop service "jupyterlab" -```console - vi /etc/systemd/system/jupyterlab.service -``` - -### Add next lines to launch like "opc" user the script "launchjupyterlab.sh" -```console - [Unit] - Description=Service to start jupyterlab for opc - Documentation= - [Service] - User=opc - Group=opc - Type=forking - WorkingDirectory=/home/opc - ExecStart=/home/opc/launchjupyterlab.sh start - ExecStop=/home/opc/launchjupyterlab.sh stop - [Install] - WantedBy=multi-user.target -``` - -### Test Jupyterlab Service -```console - systemctl start jupyterlab - systemctl status jupyterlab - systemctl enable jupyterlab -``` - -## Reboot Your machine to final check - -Now, you must reboot your machine to check if jupyterlab script is enabled by default on port defined 8001. - -You must open port 8001 to your virtual machine VM 2.1 in order to access using your Public IP. -```console - firewall-cmd --permanent --zone=public --list-ports - firewall-cmd --get-active-zones - firewall-cmd --permanent --zone=public --add-port=8001/tcp - firewall-cmd --reload -``` - -If you're running directly on a virtual machine and have a browser installed it should take you directly into the jupyter environment. Connect to your "[http://xxx.xxx.xxx.xxx:8001/](http://xxx.xxx.xxx.xxx:8001/)". - -And you should see the next Python Web environment "Jupyterlab".