From 46c8072235afb3556912f3b4cb191755de424564 Mon Sep 17 00:00:00 2001 From: FlorentLvr <48032461+FlorentLvr@users.noreply.github.com> Date: Mon, 20 Nov 2023 10:35:24 +0100 Subject: [PATCH 01/18] feat: add datetime logo --- .github/assets/logos/Datetime.png | Bin 0 -> 255330 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/assets/logos/Datetime.png diff --git a/.github/assets/logos/Datetime.png b/.github/assets/logos/Datetime.png new file mode 100644 index 0000000000000000000000000000000000000000..d493191fda48448bc6e73e7c7bd8b546207a770b GIT binary patch literal 255330 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 z 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 IY<}ba0c^MlI{*Lx literal 0 HcmV?d00001 From cfdfc4754a7b8940bfc5dddf864c1bedf6bba2a7 Mon Sep 17 00:00:00 2001 From: FlorentLvr <48032461+FlorentLvr@users.noreply.github.com> Date: Mon, 20 Nov 2023 10:40:57 +0100 Subject: [PATCH 02/18] fix: delete .github/assets/logos/Twitter.png --- .github/assets/logos/Twitter.png | Bin 32029 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/assets/logos/Twitter.png diff --git a/.github/assets/logos/Twitter.png b/.github/assets/logos/Twitter.png deleted file mode 100644 index e09b971db1fe6bcd0387517590511bc72006d851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32029 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 From d5a3a03c0c8f2087201b190b1d5e814c3b981c4b Mon Sep 17 00:00:00 2001 From: FlorentLvr <48032461+FlorentLvr@users.noreply.github.com> Date: Mon, 20 Nov 2023 10:41:20 +0100 Subject: [PATCH 03/18] feat: add new twitter logo 'x' --- .github/assets/logos/Twitter.jpeg | Bin 0 -> 5579 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/assets/logos/Twitter.jpeg diff --git a/.github/assets/logos/Twitter.jpeg b/.github/assets/logos/Twitter.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..021e4573076b977716fb3205007f3adc9a1b15d0 GIT binary patch literal 5579 zcmb7n2UJr}x9>?p=#bF6bPPzZ(yR2Y^d_MQ2uKwRiUg7EVP?Lrp;eXN1$x(K9eGP{Np) z8R?m6=^5xRHUU8hYlxs^P$(Ha6$KUj|F@iD02)%@Gw>M#;sL-kAP5cUyc6Ic9FlOf zi}U^?B&5V-U?M08LYSui_lbW2&ZhuM2w@Q%0w;W9)y;pF{d>ADYkGB+cN^`m+bSzQG!4(= znC?0ZRoKx%M_g7A2Sg}({g50O_6PS$acBdvS|q6@N4bicBYyQaH`cGgd)hd*$%(F#s?&cCX1U(USa_ zBZIWCkk-}BX8F2&BEbHG5L_S#2ME3gUBu3R1BnSS1c1OK3~(lKMlLlPS~_~}n|=hp zkP^HFf`ZS!vLn7#IriJOh9#i~ufRa15AD6^__3tm5rho#O=Tumd*#TmHR(1|M{8R}+0uE>&CXDDy$>B5 z4c~5j62>?FIwt#R8R^8>Z{ecFX-x@{D}EN-iyew@Ub6V|{q`z;y2AE+S?r4KNJoyF z9hd5pWG0pXGhQm{DRSlGMP6GLX3-n_Sdi?yog%{mI*G-?DNJ=OF_ve)jt=m^B4 zuIYE>OL0PgkpTJOqRghNGB@(Se;VgMA&MSrv<{Q*3-8-z%Fwg7G)}^%bBAo9??>~E zHQo%N-bUL*50?zXPVR>am@p*WMQEo;8%EH(PNpUaONl(Y&;OF!ouB45Z$zX~R3KBv zfyi|EhM(Fod2OMYH#zc!x^_Rz_^sj<27$;9u>Yc7fm5xm#Lry5dIvQwdmVVSWA{-; zFJ8|ACcB0;-AeJ#7IaE6?g$BgbWYh(); z!O+7W`T!5v+EG>Lyw5=2YoV~Vu$G|rBfYM%176D>yz$UpDOcUo{fqg%Z+H{hm}2o> z;S+^L$esd6c8TO<@JLWolO^-xz8f{In&}_7$qXmCFGcy7!5YtihIxrFpJaKj+$nz_ zmzfru<5z(pSDhX*J3rd@g zelG2}T-nq7c}87lb#`4z3oBDbujUeL8T@wOJDb(j#7DXj=2RV{WUPO5MB{sB+Ll~V zvM{#zV&~F0If>GYtVR*Up&gQ>DU#BKe0R3!^^S!!OQSw-J;|gx5Fu+@{lF& z^nmm#{ww%C>4Ma#DiIkC=H=Kr8u!L;YvGA92IO-8|1E0t(g}(u41$vaUkx zI56EMuNPlq*)`2!*5V>|_*bJZ&nR`M%mrdk-I#taZ2Mf_QF!*%WwI^2)31srsFZ1_ z^mt`KV%sw`s4UO3iRwGsH3I|Y=geK7Z1tPVi2S;xUTyeV8vJ-;__YJ0^vJ`F-^OSz zA*0!n{fLT1`xJXC@fvj^!A1qbW_P^ggYpAgLi(A+%OB?&zmMIZ3+rK0EHMr@4W`Dv z^A?=L#ox+sDT5Xi78%B*?$^%x@EaLEMes7!vpMAnA}1-+N*@)qZD zTQFNl@Y;`-<{=#RWzO&3Pt#N-MWu!WM`bWRdz-l}5L-=*v($Wo zf7r5~mR3<9RiEoSjV;Oxq3L4oyXB*1mzsF66{>^l>H5W4^GE*$o`FR9G}|A!9VO&s zXZ-%t23;qTaxqJ=!QE;5(8e_(qL5hrT>-34m#Vb@fwz-50p zq!YQFAQU7xZKUIVMgsqYzH<)POmE#oUUg5AHdzyDfpI2HER=;G$`iuM`6F(WzaN3i zP+@FnK$G=p3N6-6>FWihP9+-4e0K{%zAf46u$JA4B*zE2JDlx*8Ki%HNsdMMjTxgv z)pDW(f|Fp^bv;UiTlyFMf;EAGp+*Pq{eUJ8hE3*p=IX%7#3#`T&h zq0g}T%;AK)ahf)Uhkkuxml#or4vc$+so_miwziRr7qRsCQ*C$gqDw&engHf)DG5dr zHc!<-JNINfwcu8pmR@_ze3sTujDiMLVH}fG*~3yH>iWr#CywUD#+l%iQi8o6Yyqvg zYBqjR0ZxuTuECH>{(4WhymJxDS#Imc(P2C2{hv+Trr(PMy9R$HBp^v!Ic`piGT`a5 z7nCkXGoe;zk4i}{OxcP2IZ_r(r9Pr4H?y^in>Xai75@30alK_QY^QTVA^cah^Bb;p zorG9{?YlXqW5aAk@v9RZ9A4aQwABal=UZl^2v1{)`!kp@;IggK_8GlzDG{&Z527;nDTK*tHWABAl66&jF;| ziT9UvhlyG1waWvGZ+yc|eN(?FSrW0ePy0INhUs398~)BN%M}+>_eIR>7A{M9Z9#;6 z>m5pvNzmGdksDyBS<#q2{hpi2q2HYSJU4n&C(1AFanjUN;!ESL{sC|r0h(lw>h&I) zdhC@<{=l?>sop=&h%3SjnDOh6x3^AemFnjDtWvP+Sa@r8uo35$C5GH1gVf5L>m8+| zO;M5r*1Y22)I`3+f}1C9;z^;b&98S}P1dk^)u^1gmHRU`198b}9LvXgW@g+Oo>c1_ zO@oOZIX%L+1g*VgqbgSAs~pC4GbyhfcVT9ncV7MP2bMj(506>CPVr4=v!R1{BruD& znB`r3-ugMP1tU=Y6*wVRfk41eD2N~zln$Z+xCvD5>>mynPpRGFQp<1ujhp|U#733- z92n7h9;|yq)GN?FOCBBQwLFR~p#3KE6Oo}qHyp<6kfQ3Y(OrF-=w|I=#__Qu#Dsr> z<4BD95}G0@oj?wnky}|=nQuJl7H{(_zg4MKCaJF;5x{J`iV)59*zxvY1m~wIQ=C*; zF@K;q5nH;NT(UzK=9!0H87@^a_~8B+%q-=D!C=obgUa<^+H;ydXTMEJ z?#JI-pI>;{FTHpqO_Ss_b;3~sQvM7@dTvU0m5=@o-^`hr87m2Gp)aqdc3jWJwn~jX z5nnk{&OPCBvA2`kTBAN=@~>$UdCZ8vmy@h3JLTK3TUy6*W-%I4)>SLn46&F(8473L zQLM6kCEk?cVHQ~cutayQRZDd#SVkb~q=m6Z`F}(gRlt&WIQn`tIwogd>kie}crf34m3Rl8URpJovf-Ul&O<*7?v#>(cPDx>M0y3?5i z<;OkjiTvJ|HKXf`?JY6aztsgMZ~DwLYAMfsWjp43z2)v|$bYp0iM)zcrfSKaZ<`cw zg#{d3#pAB~S0=nVV()E=%(fF!Y-{pIU#)z#B^rHKUbAA)v(!l3lCoVnurT#Gn?CQI z{j9u4P`4h-Bz_hxMF1l$O9Sx*rnlU)E@`I26X;NtyK-T!3a2S;?@(3bi4g{%1boJ> zw3VT!?e~2AitfP=j3KYNuSM4jv4IXN1gxxi(R;*Pl%a=%RY`g;P5T^JuHOT0UDFqb z+W&OWI+^~E=-C@;SlnFyXs$GC2+wp$VL-{rgi=((4yji6jJzC=q$1m)@GZ&mCRXQZ5_)GTspRuPBuW1EFWrpjiZVekNs8HW8 z_q7cb!EI$`t==8jl?;*nqhT#NCT?vg`|&{yGUf)IyUF+8xn=zdH_}7JSUkhR`Argk zhxt$$8uwkj!*44Q5M;0SKtOmj%7upQk>eNr8Jy%zx}MbLZrdpU1cvY+q=qv z^%#}9^wNWywI#rK7GLa9=u8>AWLW>BF1oS%efNXm)6qY3?N#z+#fZLBE0340ENi$P z6O!;}XgBK$Rf?e!DXK%s_Hm33GX*saxBhGKonvgt4up)IM(cKb`FOh+nwQa;K@1gPxT306hnjp^#3GL zTmT?VxB(at0Km;JAY5OG{*C|uSVLOlVuZjqTpb;M6@cCR89mp9Dvl(hUjP#nN(=y~ z_Yhr-{omzpf&3p*TloJgwfzeaBoHAO0)PQ15uv*f5DhnQL45kWfsg`C>+PW-VW4-UkUlHb12un-Xsph+VA z$dhhN)|+2WRfD};u}*fw9_tiBV?fgEk-%4$tLc(P^f2r6uMC9{-(zG$9-Bk4Q?a{B zOH-qp$(7g9k_;d|Z!Mi!l9i%BTW&H1D#~p4+;U(*ODohpwOl@ui+_u__Y$gvp>xjF zA|~M_-l(5W@?j8%qq>|llp_RJq_3s_Sf_T6Qk2g&-XlCL%B z?j;$h2|X#$%eXDtiWTqM0>V+b-|3*5oHg{! zZ&sB@gv(8>V|Z?|i(n*x-;BgD`N<_k?Qo8m0^|nUAEH;wL_7FryvRzPqLvrM_!?`i za-DZ5yY1E^B9&KQO9jgtHPs@hzN@5lPZyl}(6{$U0R}(ECms+lQ)oHxR_8fRX3~OU zi#hn{C!0tN$;8t`jIT(uhN&CwJt+@bp>nloijEM4{W{SC~l zh*!1AHw?17Gr-qO@yJ=UN6XvV1&=xwYfj&5*u9Sw8(1&rU>NM`0 z^zz{+5_l5inc_`SNfjqn6}TrhvKo>gq{8Yl;r=4++M*ipg#d=r(2S@2F;6eYUymEH zNV1n=B`&yTP_9i;fXLh4$d3+d(N(dEc^ozVSr$$#E^Viwhpve)?@~|x6LGIxi!l^v z+MXH2rcy@P)d&a43(!IiPk9 zbjRs}M@=DI8SdO`KEmV2v?nyIT&xAg<&qJ>)?B+;>0|Y3&pMTgihi=$NU$&lTRl_Y zi;TsAXej0z*0>W;@1T6SIy z_n;gY%n6@Np%M=sQHW5NNHHwXLfqx0Nt|v~lzY7L3;W6W6HEJ-*tgvoKk-UDovjo9m&s4>*EZWd^}S5e`M>&>9| z9SbOUpmv!S1H?SZm0y5t1w=DA^I|=vxZmbRre%+R^enTM+$`AQ9B@HOKbKx&V&8!( z?J1~e5h+g1Fk#3#ujYEI`JcpS%>}MhGVg0{&ktfx7{MDERold+JGE_lTo}?a9|j5w z3x~np+cw)Pa^=w>4K)bvNp&89&P_EJQcWL)O$XilcfBzO5YohyW##Oi1E!SFY>*2> z+TtXvBZaPnFLoFA0b0g@9&_Yj4v@MZ;&;Z Date: Mon, 20 Nov 2023 16:02:53 +0100 Subject: [PATCH 04/18] feat: get billing template --- ...t_cost_and_usage_by_service_and_type.ipynb | 629 ++++++++++++++++++ 1 file changed, 629 insertions(+) create mode 100644 AWS/AWS_Get_cost_and_usage_by_service_and_type.ipynb diff --git a/AWS/AWS_Get_cost_and_usage_by_service_and_type.ipynb b/AWS/AWS_Get_cost_and_usage_by_service_and_type.ipynb new file mode 100644 index 0000000000..8094e34d12 --- /dev/null +++ b/AWS/AWS_Get_cost_and_usage_by_service_and_type.ipynb @@ -0,0 +1,629 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "266852e3", + "metadata": { + "execution": { + "iopub.execute_input": "2021-09-14T08:04:28.994722Z", + "iopub.status.busy": "2021-09-14T08:04:28.994452Z", + "iopub.status.idle": "2021-09-14T08:04:29.005991Z", + "shell.execute_reply": "2021-09-14T08:04:29.005065Z", + "shell.execute_reply.started": "2021-09-14T08:04:28.994658Z" + }, + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "\"AWS.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "b6c7847d", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "# AWS - Get cost and usage by service and type\n", + "

Give Feedback | Bug report" + ] + }, + { + "cell_type": "markdown", + "id": "f5907052", + "metadata": { + "execution": { + "iopub.execute_input": "2021-09-14T08:05:41.428494Z", + "iopub.status.busy": "2021-09-14T08:05:41.428138Z", + "iopub.status.idle": "2021-09-14T08:05:41.432127Z", + "shell.execute_reply": "2021-09-14T08:05:41.430935Z", + "shell.execute_reply.started": "2021-09-14T08:05:41.428433Z" + }, + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "**Tags:** #aws #cloud #ce #operations #snippet" + ] + }, + { + "cell_type": "markdown", + "id": "ce780499-ecc8-40d6-997a-43f92b60e0ce", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel/)" + ] + }, + { + "cell_type": "markdown", + "id": "dba1251e-f724-4d58-935a-54f5b6c9447b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-20 (Created: 2021-09-14)" + ] + }, + { + "cell_type": "markdown", + "id": "naas-description", + "metadata": { + "papermill": {}, + "tags": [ + "description" + ] + }, + "source": [ + "**Description:** This notebook leverages the AWS Cost Explorer API to retrieve detailed cost and usage information by service and usage type from an AWS account. By utilizing the Cost Explorer API, users can efficiently access and analyze their AWS costs, enabling better cost management and optimization. Gain insights into your AWS spending with this notebook's integration of the powerful Cost Explorer API." + ] + }, + { + "cell_type": "markdown", + "id": "b4afd1ce-6ede-45aa-8db2-9624bfb24a87", + "metadata": { + "papermill": {}, + "tags": [ + "description" + ] + }, + "source": [ + "**References:**\n", + "- [Using the AWS Cost Explorer API](https://docs.aws.amazon.com/cost-management/latest/userguide/ce-api.html)" + ] + }, + { + "cell_type": "markdown", + "id": "825a5464", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "589e943d", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bbbd2c53", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "outputs": [], + "source": [ + "import naas\n", + "try:\n", + " import boto3\n", + "except:\n", + " !pip install boto3\n", + " import boto3\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "10278504", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "### Setup variables\n", + "**Mandatory**\n", + "- `aws_access_key_id`: This variable is used to store the AWS access key ID.\n", + "- `aws_secret_access_key`: This variable is used to store the AWS secret access key.\n", + "- `start_date`: This variable is used to store the first date to get the data from.\n", + "- `end_date`: This variable is used to store the last date to get the data from. It must be the first of a month.\n", + "\n", + "**Optional**\n", + "- `granularity`: This variable is used to define cost granularity by date. Granularity can only be MONTHLY, DAILY or HOURLY.\n", + "- `file_path`: This variable is used to define csv file path to be stored in local with billing details." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9fe47224", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "outputs": [], + "source": [ + "# Mandatory\n", + "aws_access_key_id = naas.secret.get(\"AWS_ACCESS_KEY_ID\") or \"YOUR_AWS_ACCESS_KEY_ID\"\n", + "aws_secret_access_key = naas.secret.get(\"AWS_SECRET_ACCESS_KEY\") or \"YOUR_AWS_SECRET_ACCESS_KEY\"\n", + "start_date = \"2023-01-01\"\n", + "end_date = \"2023-12-01\"\n", + "\n", + "# Optional\n", + "granularity = \"MONTHLY\"\n", + "file_path = \"billing_aws.csv\"" + ] + }, + { + "cell_type": "markdown", + "id": "4eb03b12", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "8aa2658d", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "### Connect to AWS" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ded6a696", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "outputs": [], + "source": [ + "client = boto3.client(\n", + " \"ce\",\n", + " aws_access_key_id=aws_access_key_id,\n", + " aws_secret_access_key=aws_secret_access_key,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9c7a52b8", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "### Get current cost from AWS billing" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58edcd48", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "outputs": [], + "source": [ + "# Get current cost from AWS billing\n", + "result = client.get_cost_and_usage(\n", + " TimePeriod={\"Start\": start_date, \"End\": end_date},\n", + " Granularity=granularity,\n", + " Metrics=[\"BlendedCost\"],\n", + " GroupBy=[\n", + " {\"Type\": \"DIMENSION\", \"Key\": \"SERVICE\"},\n", + " {\"Type\": \"DIMENSION\", \"Key\": \"USAGE_TYPE\"},\n", + " ],\n", + ")\n", + "\n", + "# Transform current billing to dataframe\n", + "data_billing = []\n", + "for t in result[\"ResultsByTime\"]:\n", + " for r in t[\"Groups\"]:\n", + " dimension = r[\"Keys\"][0]\n", + " usage_type = r[\"Keys\"][1]\n", + " amount = r[\"Metrics\"][\"BlendedCost\"][\"Amount\"]\n", + " period_start = t[\"TimePeriod\"][\"Start\"]\n", + " period_end = t[\"TimePeriod\"][\"End\"]\n", + " data_billing.append(\n", + " {\n", + " \"Dimension\": dimension,\n", + " \"UsageType\": usage_type,\n", + " \"Amount\": amount,\n", + " \"PeriodStart\": period_start,\n", + " \"PeriodEnd\": period_end,\n", + " }\n", + " )\n", + "\n", + "# Create dataframe\n", + "df_billing = pd.DataFrame(data_billing).astype({\"Amount\": \"float\"})\n", + "\n", + "# Display result\n", + "current_amount = df_billing[\"Amount\"].sum()\n", + "print(\"Current Amount:\", round(current_amount, 2))\n", + "df_billing.head(5)" + ] + }, + { + "cell_type": "markdown", + "id": "64bb4d94", + "metadata": { + "execution": { + "iopub.execute_input": "2021-06-15T17:13:04.069988Z", + "iopub.status.busy": "2021-06-15T17:13:04.069748Z", + "iopub.status.idle": "2021-06-15T17:13:04.092911Z", + "shell.execute_reply": "2021-06-15T17:13:04.091872Z", + "shell.execute_reply.started": "2021-06-15T17:13:04.069964Z" + }, + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "8e03dcf1", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "### Save current billing to csv" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d676c8d", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "outputs": [], + "source": [ + "df_billing.to_csv(file_path)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "naas": { + "notebook_id": "3e342697d70a5fc4884c84d82b7b2d1efc9f8dde26b142ec2e63c2246dbfd05b", + "notebook_path": "AWS/AWS_Daily_biling_notification_to_slack.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.3.3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "15369ba21db1460284b7b8e9cb622d06": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_4bb52491f55641b4b62c32aa7e0679e1", + "style": "IPY_MODEL_7c0a38e90d65465fb0b6193a4146f9a6" + } + }, + "1aae19e8ce9a49049642ea9c5fd522e4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "237ff9b58a114ce69a1db5d8d4693e6a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_8908e36294e149c68f2bc6fa1637a0b4", + "style": "IPY_MODEL_c9dd15482da84e72b2a09ba479a75245" + } + }, + "2a26fb87acca44beb611cbb56bc70c09": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "2b2660a06a2446bd842fa3e9c9c6fe08": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "3a7f05b1cac74dc2a203ba8bf2f1fe17": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "3a7f3ca1a92240efa7896385485671fb": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_843aeeced14c4d94a613d8ac1cfa1797" + } + }, + "4bb52491f55641b4b62c32aa7e0679e1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "4d73c28b4d304c5f9657f9934ef4adc5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "568ff82a25a64bfba3610d451acbcc26": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_3a7f05b1cac74dc2a203ba8bf2f1fe17" + } + }, + "58d8487f8bf5487d9bfb521438adb0f2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "78c774bb848a47efb2556442ca642233": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_d7e1ad37e7954862af3449f27cae11a0", + "style": "IPY_MODEL_f338980fb865425eb18b14d5fb8a5e9f" + } + }, + "7c0a38e90d65465fb0b6193a4146f9a6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "825f9fb5a2234ffaaaea0deaf86b206d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_58d8487f8bf5487d9bfb521438adb0f2", + "style": "IPY_MODEL_e4362a71f75649bf93d3d919b63f23ad" + } + }, + "843aeeced14c4d94a613d8ac1cfa1797": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "8908e36294e149c68f2bc6fa1637a0b4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "8da4a28960ea418abebd4f3115fde42b": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_ae604bbf2607454b8aa2366a0beeb88d", + "outputs": [ + { + "data": { + "text/html": "
✅ Copied !
", + "text/plain": "" + }, + "metadata": {}, + "output_type": "display_data" + } + ] + } + }, + "966ac94ef1b44754a7bcf80c42ef6940": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_eed4098f55ec4f2bb3176be711254168" + } + }, + "ae604bbf2607454b8aa2366a0beeb88d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "b00a2988bfde49b7844768963db33daf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_e26a69e9d8b04eb5a4f96b33ecce581d", + "style": "IPY_MODEL_1aae19e8ce9a49049642ea9c5fd522e4" + } + }, + "c9dd15482da84e72b2a09ba479a75245": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "ca9237340fa04e7888f382da12da4732": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_caa17a7ee7ea4b78b1b0c50bb2962e84", + "style": "IPY_MODEL_4d73c28b4d304c5f9657f9934ef4adc5" + } + }, + "caa17a7ee7ea4b78b1b0c50bb2962e84": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "d7b09bb706544af1a4d8b9806dadd5f7": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_2a26fb87acca44beb611cbb56bc70c09" + } + }, + "d7e1ad37e7954862af3449f27cae11a0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "e26a69e9d8b04eb5a4f96b33ecce581d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "e4362a71f75649bf93d3d919b63f23ad": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "eed4098f55ec4f2bb3176be711254168": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "ef0da7f8494748e284cb1fead6471e1b": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_2b2660a06a2446bd842fa3e9c9c6fe08" + } + }, + "f338980fb865425eb18b14d5fb8a5e9f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + } + }, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 8c7d67410de688cc20a4494f7bb498bfec94d398 Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 16:05:39 +0100 Subject: [PATCH 05/18] feat: add aws template to get forecast --- AWS/AWS_Get_cost_forecast.ipynb | 607 ++++++++++++++++++++++++++++++++ 1 file changed, 607 insertions(+) create mode 100644 AWS/AWS_Get_cost_forecast.ipynb diff --git a/AWS/AWS_Get_cost_forecast.ipynb b/AWS/AWS_Get_cost_forecast.ipynb new file mode 100644 index 0000000000..c7c81acddb --- /dev/null +++ b/AWS/AWS_Get_cost_forecast.ipynb @@ -0,0 +1,607 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "266852e3", + "metadata": { + "execution": { + "iopub.execute_input": "2021-09-14T08:04:28.994722Z", + "iopub.status.busy": "2021-09-14T08:04:28.994452Z", + "iopub.status.idle": "2021-09-14T08:04:29.005991Z", + "shell.execute_reply": "2021-09-14T08:04:29.005065Z", + "shell.execute_reply.started": "2021-09-14T08:04:28.994658Z" + }, + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "\"AWS.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "b6c7847d", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "# AWS - Get cost forecast\n", + "

Give Feedback | Bug report" + ] + }, + { + "cell_type": "markdown", + "id": "f5907052", + "metadata": { + "execution": { + "iopub.execute_input": "2021-09-14T08:05:41.428494Z", + "iopub.status.busy": "2021-09-14T08:05:41.428138Z", + "iopub.status.idle": "2021-09-14T08:05:41.432127Z", + "shell.execute_reply": "2021-09-14T08:05:41.430935Z", + "shell.execute_reply.started": "2021-09-14T08:05:41.428433Z" + }, + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "**Tags:** #aws #cloud #ce #operations #snippet" + ] + }, + { + "cell_type": "markdown", + "id": "ce780499-ecc8-40d6-997a-43f92b60e0ce", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel/)" + ] + }, + { + "cell_type": "markdown", + "id": "dba1251e-f724-4d58-935a-54f5b6c9447b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-20 (Created: 2021-09-14)" + ] + }, + { + "cell_type": "markdown", + "id": "naas-description", + "metadata": { + "papermill": {}, + "tags": [ + "description" + ] + }, + "source": [ + "**Description:** This notebook utilizes the AWS Cost Explorer to retrieve accurate cost forecasts from an AWS account. By leveraging the Cost Explorer's forecasting capabilities, users can proactively plan and estimate their future AWS costs. Stay ahead of your budget with this notebook's integration of the AWS Cost Explorer, enabling you to make informed decisions and optimize your AWS spending." + ] + }, + { + "cell_type": "markdown", + "id": "b4afd1ce-6ede-45aa-8db2-9624bfb24a87", + "metadata": { + "papermill": {}, + "tags": [ + "description" + ] + }, + "source": [ + "**References:**\n", + "- [Using the AWS Cost Explorer API](https://docs.aws.amazon.com/cost-management/latest/userguide/ce-api.html)" + ] + }, + { + "cell_type": "markdown", + "id": "825a5464", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "589e943d", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bbbd2c53", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "outputs": [], + "source": [ + "import naas\n", + "from datetime import date\n", + "try:\n", + " import boto3\n", + "except:\n", + " !pip install boto3\n", + " import boto3\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "10278504", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "### Setup variables\n", + "**Mandatory**\n", + "- `aws_access_key_id`: This variable is used to store the AWS access key ID.\n", + "- `aws_secret_access_key`: This variable is used to store the AWS secret access key.\n", + "- `start_date`: This variable is used to store the first date to get the data from.\n", + "- `end_date`: This variable is used to store the last date to get the data from. It must be the first of a month.\n", + "\n", + "**Optional**\n", + "- `granularity`: This variable is used to define cost granularity by date. Granularity can only be MONTHLY, DAILY or HOURLY.\n", + "- `file_path`: This variable is used to define csv file path to be stored in local with billing details." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9fe47224", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "outputs": [], + "source": [ + "# Mandatory\n", + "aws_access_key_id = naas.secret.get(\"AWS_ACCESS_KEY_ID\") or \"YOUR_AWS_ACCESS_KEY_ID\"\n", + "aws_secret_access_key = naas.secret.get(\"AWS_SECRET_ACCESS_KEY\") or \"YOUR_AWS_SECRET_ACCESS_KEY\"\n", + "start_date = date.today().isoformat()\n", + "end_date = \"2023-11-30\"\n", + "\n", + "# Optional\n", + "granularity = \"MONTHLY\"\n", + "file_path = \"billing_aws.csv\"" + ] + }, + { + "cell_type": "markdown", + "id": "4eb03b12", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "8aa2658d", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "### Connect to AWS" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ded6a696", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "outputs": [], + "source": [ + "client = boto3.client(\n", + " \"ce\",\n", + " aws_access_key_id=aws_access_key_id,\n", + " aws_secret_access_key=aws_secret_access_key,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "37b38254-1ad3-4c5e-8fa6-482e39c073ab", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "### Get forecast from AWS" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b5220e2-15f0-44ec-8ed4-1c4bc2a546bf", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "outputs": [], + "source": [ + "ce_forecast = client.get_cost_forecast(\n", + " TimePeriod={\"Start\": start_date, \"End\": end_date},\n", + " Metric=\"BLENDED_COST\",\n", + " Granularity=granularity,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "64bb4d94", + "metadata": { + "execution": { + "iopub.execute_input": "2021-06-15T17:13:04.069988Z", + "iopub.status.busy": "2021-06-15T17:13:04.069748Z", + "iopub.status.idle": "2021-06-15T17:13:04.092911Z", + "shell.execute_reply": "2021-06-15T17:13:04.091872Z", + "shell.execute_reply.started": "2021-06-15T17:13:04.069964Z" + }, + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "8e03dcf1", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d676c8d", + "metadata": { + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "outputs": [], + "source": [ + "forecast = float(ce_forecast[\"Total\"][\"Amount\"])\n", + "print(\"Forecast Amount:\", round(forecast, 2))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16deb3cd-1cdb-475a-a879-e6ddf6dead1d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "naas": { + "notebook_id": "3e342697d70a5fc4884c84d82b7b2d1efc9f8dde26b142ec2e63c2246dbfd05b", + "notebook_path": "AWS/AWS_Daily_biling_notification_to_slack.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.3.3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "15369ba21db1460284b7b8e9cb622d06": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_4bb52491f55641b4b62c32aa7e0679e1", + "style": "IPY_MODEL_7c0a38e90d65465fb0b6193a4146f9a6" + } + }, + "1aae19e8ce9a49049642ea9c5fd522e4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "237ff9b58a114ce69a1db5d8d4693e6a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_8908e36294e149c68f2bc6fa1637a0b4", + "style": "IPY_MODEL_c9dd15482da84e72b2a09ba479a75245" + } + }, + "2a26fb87acca44beb611cbb56bc70c09": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "2b2660a06a2446bd842fa3e9c9c6fe08": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "3a7f05b1cac74dc2a203ba8bf2f1fe17": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "3a7f3ca1a92240efa7896385485671fb": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_843aeeced14c4d94a613d8ac1cfa1797" + } + }, + "4bb52491f55641b4b62c32aa7e0679e1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "4d73c28b4d304c5f9657f9934ef4adc5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "568ff82a25a64bfba3610d451acbcc26": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_3a7f05b1cac74dc2a203ba8bf2f1fe17" + } + }, + "58d8487f8bf5487d9bfb521438adb0f2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "78c774bb848a47efb2556442ca642233": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_d7e1ad37e7954862af3449f27cae11a0", + "style": "IPY_MODEL_f338980fb865425eb18b14d5fb8a5e9f" + } + }, + "7c0a38e90d65465fb0b6193a4146f9a6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "825f9fb5a2234ffaaaea0deaf86b206d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_58d8487f8bf5487d9bfb521438adb0f2", + "style": "IPY_MODEL_e4362a71f75649bf93d3d919b63f23ad" + } + }, + "843aeeced14c4d94a613d8ac1cfa1797": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "8908e36294e149c68f2bc6fa1637a0b4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "8da4a28960ea418abebd4f3115fde42b": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_ae604bbf2607454b8aa2366a0beeb88d", + "outputs": [ + { + "data": { + "text/html": "
✅ Copied !
", + "text/plain": "" + }, + "metadata": {}, + "output_type": "display_data" + } + ] + } + }, + "966ac94ef1b44754a7bcf80c42ef6940": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_eed4098f55ec4f2bb3176be711254168" + } + }, + "ae604bbf2607454b8aa2366a0beeb88d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "b00a2988bfde49b7844768963db33daf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_e26a69e9d8b04eb5a4f96b33ecce581d", + "style": "IPY_MODEL_1aae19e8ce9a49049642ea9c5fd522e4" + } + }, + "c9dd15482da84e72b2a09ba479a75245": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "ca9237340fa04e7888f382da12da4732": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Copy URL", + "layout": "IPY_MODEL_caa17a7ee7ea4b78b1b0c50bb2962e84", + "style": "IPY_MODEL_4d73c28b4d304c5f9657f9934ef4adc5" + } + }, + "caa17a7ee7ea4b78b1b0c50bb2962e84": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "d7b09bb706544af1a4d8b9806dadd5f7": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_2a26fb87acca44beb611cbb56bc70c09" + } + }, + "d7e1ad37e7954862af3449f27cae11a0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "e26a69e9d8b04eb5a4f96b33ecce581d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "e4362a71f75649bf93d3d919b63f23ad": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "eed4098f55ec4f2bb3176be711254168": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "ef0da7f8494748e284cb1fead6471e1b": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "layout": "IPY_MODEL_2b2660a06a2446bd842fa3e9c9c6fe08" + } + }, + "f338980fb865425eb18b14d5fb8a5e9f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + } + }, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 287f1ab1d499cf047088ca7d0f6a1833ee0dbd56 Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 16:06:13 +0100 Subject: [PATCH 06/18] feat: send daily biling notification update --- ..._daily_biling_notification_to_Slack.ipynb} | 277 +++++++----------- 1 file changed, 100 insertions(+), 177 deletions(-) rename AWS/{AWS_Daily_biling_notification_to_slack.ipynb => AWS_Send_daily_biling_notification_to_Slack.ipynb} (83%) diff --git a/AWS/AWS_Daily_biling_notification_to_slack.ipynb b/AWS/AWS_Send_daily_biling_notification_to_Slack.ipynb similarity index 83% rename from AWS/AWS_Daily_biling_notification_to_slack.ipynb rename to AWS/AWS_Send_daily_biling_notification_to_Slack.ipynb index c41c6d6f34..3c44eb6a6c 100644 --- a/AWS/AWS_Daily_biling_notification_to_slack.ipynb +++ b/AWS/AWS_Send_daily_biling_notification_to_Slack.ipynb @@ -30,7 +30,7 @@ ] }, "source": [ - "# AWS - Daily biling notification to slack\n", + "# AWS - Send daily biling notification to Slack\n", "

Give Feedback | Bug report" ] }, @@ -51,7 +51,7 @@ ] }, "source": [ - "**Tags:** #aws #cloud #storage #S3bucket #slack #operations #automation" + "**Tags:** #aws #cloud #storage #slack #operations #automation #naas #asset #scheduler" ] }, { @@ -75,7 +75,7 @@ "tags": [] }, "source": [ - "**Last update:** 2023-04-12 (Created: 2021-09-14)" + "**Last update:** 2023-11-20 (Created: 2021-09-14)" ] }, { @@ -88,53 +88,39 @@ ] }, "source": [ - "**Description:** This notebook sends a daily notification to a Slack channel with the billing information from an AWS account. It allows users to easily keep track of their AWS spending." + "**Description:** This notebook utilizes AWS API and Slack integration to send a daily notification to a designated Slack channel. The notification includes detailed billing information from an AWS account, enabling users to effortlessly track and monitor their AWS spending. Stay informed about your AWS costs with automated daily updates." ] }, { "cell_type": "markdown", - "id": "825a5464", + "id": "b4afd1ce-6ede-45aa-8db2-9624bfb24a87", "metadata": { "papermill": {}, "tags": [ - "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + "description" ] }, "source": [ - "## Input" + "**References:**\n", + "- [Using the AWS Cost Explorer API](https://docs.aws.amazon.com/cost-management/latest/userguide/ce-api.html)" ] }, { "cell_type": "markdown", - "id": "7d9fafd1-90ee-43d8-9408-ba87036ea265", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" - ] - }, - "source": [ - "### Install packages" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "20a52d7d", + "id": "825a5464", "metadata": { "papermill": {}, "tags": [ "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" ] }, - "outputs": [], "source": [ - "!pip install boto3" + "## Input" ] }, { "cell_type": "markdown", - "id": "437f45fc-c78f-4755-8d95-34ee3aee5f52", + "id": "589e943d", "metadata": { "papermill": {}, "tags": [ @@ -142,14 +128,13 @@ ] }, "source": [ - "### Setup secret keys\n", - "Uncomment to setup." + "### Import libraries" ] }, { "cell_type": "code", "execution_count": null, - "id": "af31697e-29af-4125-baa1-211009394243", + "id": "bbbd2c53", "metadata": { "papermill": {}, "tags": [ @@ -158,14 +143,21 @@ }, "outputs": [], "source": [ - "# naas.secret.add(name=\"AWS_ACCESS_KEY_ID\", secret=\"***\")\n", - "# naas.secret.add(name=\"AWS_SECRET_ACCESS_KEY\", secret=\"***\")\n", - "# naas.secret.add(name=\"SLACK_TOKEN\", secret=\"***\")" + "from datetime import date, timedelta\n", + "try:\n", + " import boto3\n", + "except:\n", + " !pip install boto3\n", + " import boto3\n", + "import naas\n", + "import dateutil.relativedelta\n", + "import pandas as pd\n", + "from naas_drivers import slack" ] }, { "cell_type": "markdown", - "id": "589e943d", + "id": "10278504", "metadata": { "papermill": {}, "tags": [ @@ -173,13 +165,22 @@ ] }, "source": [ - "### Import libraries" + "### Setup variables\n", + "**Mandatory**\n", + "- `aws_access_key_id`: This variable is used to store the AWS access key ID.\n", + "- `aws_secret_access_key`: This variable is used to store the AWS secret access key.\n", + "- `slack_token`: This variable is used to store the Slack token.\n", + "- `slack_channel`: This variable is used to specify the Slack channel.\n", + "\n", + "**Optional**\n", + "- `cron`: This variable is used to define the cron schedule for executing the code.\n", + "- `file_path`: This variable is used to define csv file path to be stored in local with billing details." ] }, { "cell_type": "code", "execution_count": null, - "id": "bbbd2c53", + "id": "9fe47224", "metadata": { "papermill": {}, "tags": [ @@ -188,46 +189,28 @@ }, "outputs": [], "source": [ - "import datetime\n", - "import boto3\n", - "import naas\n", - "import dateutil.relativedelta\n", - "import pandas as pd\n", - "import naas_drivers" + "# Mandatory\n", + "aws_access_key_id = naas.secret.get(\"AWS_ACCESS_KEY_ID\") or \"YOUR_AWS_ACCESS_KEY_ID\"\n", + "aws_secret_access_key = naas.secret.get(\"AWS_SECRET_ACCESS_KEY\") or \"YOUR_AWS_SECRET_ACCESS_KEY\"\n", + "slack_token = naas.secret.get(name=\"SLACK_TOKEN\") or \"YOUR_SLACK_TOKEN\"\n", + "slack_channel = \"bot-test\"\n", + "\n", + "# Optional\n", + "cron = \"0 9 * * *\"\n", + "file_path = f\"billing_aws_{date.today().isoformat()}.csv\"" ] }, { "cell_type": "markdown", - "id": "10278504", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" - ] - }, - "source": [ - "### Setup variables" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9fe47224", + "id": "4eb03b12", "metadata": { "papermill": {}, "tags": [ "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" ] }, - "outputs": [], "source": [ - "# AWS account\n", - "AWS_ACCESS_KEY_ID = naas.secret.get(name=\"AWS_ACCESS_KEY_ID\")\n", - "AWS_SECRET_ACCESS_KEY = naas.secret.get(name=\"AWS_SECRET_ACCESS_KEY\")\n", - "\n", - "# Slack\n", - "SLACK_TOKEN = naas.secret.get(name=\"SLACK_TOKEN\")\n", - "SLACK_CHANNEL = \"-aws-billing\"" + "## Model" ] }, { @@ -259,18 +242,20 @@ "def last_day_of_month(any_day):\n", " # this will never fail\n", " # get close to the end of the month for any day, and add 4 days 'over'\n", - " next_month = any_day.replace(day=28) + datetime.timedelta(days=4)\n", + " next_month = any_day.replace(day=28) + timedelta(days=4)\n", " # subtract the number of remaining 'overage' days to get last day of current month, or said programattically said, the previous day of the first of next month\n", - " return next_month - datetime.timedelta(days=next_month.day)\n", + " return next_month - timedelta(days=next_month.day)\n", "\n", - "\n", - "today = datetime.date.today()\n", + "today = date.today()\n", "lastDay = last_day_of_month(today)\n", "start_month_date = today - dateutil.relativedelta.relativedelta(months=12)\n", "\n", "start_date = \"{}-{:02d}-{:02d}\".format(today.year, today.month, 1)\n", "end_date = \"{}-{:02d}-{:02d}\".format(today.year, today.month, today.day)\n", - "last_day = \"{}-{:02d}-{:02d}\".format(lastDay.year, lastDay.month, lastDay.day)" + "last_day = \"{}-{:02d}-{:02d}\".format(lastDay.year, lastDay.month, lastDay.day)\n", + "print(\"Start date:\", start_date)\n", + "print(\"End date:\", end_date)\n", + "print(\"Last day:\", last_day)" ] }, { @@ -300,24 +285,11 @@ "source": [ "client = boto3.client(\n", " \"ce\",\n", - " aws_access_key_id=AWS_ACCESS_KEY_ID,\n", - " aws_secret_access_key=AWS_SECRET_ACCESS_KEY,\n", + " aws_access_key_id=aws_access_key_id,\n", + " aws_secret_access_key=aws_secret_access_key,\n", ")" ] }, - { - "cell_type": "markdown", - "id": "4eb03b12", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" - ] - }, - "source": [ - "## Model" - ] - }, { "cell_type": "markdown", "id": "9c7a52b8", @@ -334,7 +306,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e8c69d49", + "id": "58edcd48", "metadata": { "papermill": {}, "tags": [ @@ -343,45 +315,19 @@ }, "outputs": [], "source": [ + "# Get current cost from AWS billing\n", "result = client.get_cost_and_usage(\n", " TimePeriod={\"Start\": start_date, \"End\": end_date},\n", " Granularity=\"MONTHLY\",\n", - " Filter={\"Dimensions\": {\"Key\": \"RECORD_TYPE\", \"Values\": [\"Credit\", \"Refund\"]}},\n", " Metrics=[\"BlendedCost\"],\n", " GroupBy=[\n", " {\"Type\": \"DIMENSION\", \"Key\": \"SERVICE\"},\n", " {\"Type\": \"DIMENSION\", \"Key\": \"USAGE_TYPE\"},\n", " ],\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "7ab9fd4e", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" - ] - }, - "source": [ - "### Transform current billing to dataframe" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "58edcd48", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" - ] - }, - "outputs": [], - "source": [ - "df_billing = pd.DataFrame()\n", + ")\n", "\n", + "# Transform current billing to dataframe\n", + "data_billing = []\n", "for t in result[\"ResultsByTime\"]:\n", " for r in t[\"Groups\"]:\n", " dimension = r[\"Keys\"][0]\n", @@ -389,20 +335,23 @@ " amount = r[\"Metrics\"][\"BlendedCost\"][\"Amount\"]\n", " period_start = t[\"TimePeriod\"][\"Start\"]\n", " period_end = t[\"TimePeriod\"][\"End\"]\n", - " df_billing = df_billing.append(\n", + " data_billing.append(\n", " {\n", " \"Dimension\": dimension,\n", " \"UsageType\": usage_type,\n", " \"Amount\": amount,\n", " \"PeriodStart\": period_start,\n", " \"PeriodEnd\": period_end,\n", - " },\n", - " ignore_index=True,\n", + " }\n", " )\n", - "df_billing = df_billing.astype({\"Amount\": \"float\"})\n", + "\n", + "# Create dataframe\n", + "df_billing = pd.DataFrame(data_billing).astype({\"Amount\": \"float\"})\n", "\n", "# Display result\n", - "df_billing.tail(5)" + "current_amount = df_billing[\"Amount\"].sum()\n", + "print(\"Current Amount:\", round(current_amount, 2))\n", + "df_billing.head(5)" ] }, { @@ -434,27 +383,9 @@ " TimePeriod={\"Start\": end_date, \"End\": last_day},\n", " Metric=\"BLENDED_COST\",\n", " Granularity=\"MONTHLY\",\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "64bb4d94", - "metadata": { - "execution": { - "iopub.execute_input": "2021-06-15T17:13:04.069988Z", - "iopub.status.busy": "2021-06-15T17:13:04.069748Z", - "iopub.status.idle": "2021-06-15T17:13:04.092911Z", - "shell.execute_reply": "2021-06-15T17:13:04.091872Z", - "shell.execute_reply.started": "2021-06-15T17:13:04.069964Z" - }, - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" - ] - }, - "source": [ - "## Output" + ")\n", + "forecast = float(ce_forecast[\"Total\"][\"Amount\"])\n", + "print(\"Forecast Amount:\", round(forecast, 2))" ] }, { @@ -482,38 +413,8 @@ }, "outputs": [], "source": [ - "df_billing.to_csv(\"current_month_data.csv\")\n", - "naas.asset.add(path=\"current_month_data.csv\")" - ] - }, - { - "cell_type": "markdown", - "id": "8d7b1cb4", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" - ] - }, - "source": [ - "### Data from AWS billing" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cd4ebaf6", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" - ] - }, - "outputs": [], - "source": [ - "current_amount = df_billing[\"Amount\"].sum()\n", - "forecast = float(ce_forecast[\"Total\"][\"Amount\"])\n", - "asset_link = \"Copy URL from generate asset above\"" + "df_billing.to_csv(file_path)\n", + "asset_link = naas.asset.add(path=file_path)" ] }, { @@ -550,7 +451,7 @@ "- Forecast left to spent: [*{:.2f}$*]\n", "- End of month estimate: [*{:.2f}$*]\n", "\n", - "Download the detailed csv file {}\n", + "<{}|Download the detailed csv file>\n", "\"\"\".format(\n", " float(current_amount), float(forecast), float(current_amount - forecast), asset_link\n", ")\n", @@ -558,6 +459,26 @@ "print(message)" ] }, + { + "cell_type": "markdown", + "id": "64bb4d94", + "metadata": { + "execution": { + "iopub.execute_input": "2021-06-15T17:13:04.069988Z", + "iopub.status.busy": "2021-06-15T17:13:04.069748Z", + "iopub.status.idle": "2021-06-15T17:13:04.092911Z", + "shell.execute_reply": "2021-06-15T17:13:04.091872Z", + "shell.execute_reply.started": "2021-06-15T17:13:04.069964Z" + }, + "papermill": {}, + "tags": [ + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" + ] + }, + "source": [ + "## Output" + ] + }, { "cell_type": "markdown", "id": "9b236e16", @@ -583,7 +504,7 @@ }, "outputs": [], "source": [ - "naas_drivers.slack.connect(SLACK_TOKEN).send(SLACK_CHANNEL, message)" + "slack.connect(slack_token).send(slack_channel, message)" ] }, { @@ -596,7 +517,7 @@ ] }, "source": [ - "### Scheduler" + "### Add scheduler" ] }, { @@ -611,7 +532,9 @@ }, "outputs": [], "source": [ - "naas.scheduler.add(cron=\"0 9 * * *\")" + "naas.scheduler.add(cron=cron)\n", + "\n", + "# naas.scheduler.delete()" ] } ], @@ -886,4 +809,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} From a9c7985d82737935c361274ad79eba4e90ece61a Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 16:14:55 +0100 Subject: [PATCH 07/18] feat: setup connection aws --- AWS/AWS_Setup_connection.ipynb | 280 +++++++++++++++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 AWS/AWS_Setup_connection.ipynb diff --git a/AWS/AWS_Setup_connection.ipynb b/AWS/AWS_Setup_connection.ipynb new file mode 100644 index 0000000000..b660250f70 --- /dev/null +++ b/AWS/AWS_Setup_connection.ipynb @@ -0,0 +1,280 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a92ad770-55bd-450c-8e6e-de64c0347cdd", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "\"AWS.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "a5b2c509-2c29-49e8-af91-4f3f1e386da3", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# AWS - Setup connection" + ] + }, + { + "cell_type": "markdown", + "id": "d77fe283-4edd-42d3-a909-8e207d4b842f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #aws #naas #secret #connectors #connection #setup" + ] + }, + { + "cell_type": "markdown", + "id": "b90f2d91-c886-4e36-8265-b09d06bb1c7f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel)" + ] + }, + { + "cell_type": "markdown", + "id": "6bbf7807-dda4-4b8a-b016-fe258a0fa33f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-20 (Created: 2023-11-20)" + ] + }, + { + "cell_type": "markdown", + "id": "214749fe-7f0b-4755-b7ea-1d200c234cc6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook help you setup your connection with AWS. To access AWS billing using the Python API, you can use the AWS SDK for Python (Boto3). Boto3 provides a comprehensive set of APIs to interact with various AWS services, including billing." + ] + }, + { + "cell_type": "markdown", + "id": "a1329bea-ad80-4981-874c-8776b11f89a8", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n", + "- [Managing access keys for IAM users](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)\n", + "- [Naas Secret Documentation](https://site.naas.ai/docs/developers/jobs/secret)" + ] + }, + { + "cell_type": "markdown", + "id": "cff349c8-2816-4ae4-9229-027c068eeb51", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "80266a9e-fe54-4f3e-aeb2-01483bbc53f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc038b10-2679-42bc-909e-09a298339df4", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import naas" + ] + }, + { + "cell_type": "markdown", + "id": "30127040-e487-4115-8317-5084823b3a6f", + "metadata": { + "papermill": {}, + "tags": [ + "variables" + ] + }, + "source": [ + "### Setup variables\n", + "**Pre-requisites**\n", + "\n", + "To get your AWS access key ID, AWS secret access key:\n", + "1. Log in to the AWS Management Console.\n", + "2. Open the IAM (Identity and Access Management) service.\n", + "3. In the left navigation pane, click on \"Users\".\n", + "4. Select your IAM user from the list or create a new user if needed.\n", + "5. Open the \"Security credentials\" tab for the selected user.\n", + "6. Under \"Access keys\", you can view your existing access key or create a new one.\n", + "7. Take note of the Access Key ID and Secret Access Key.\n", + "\n", + "**Mandatory**\n", + "- `aws_access_key_id`: AWS access key ID. This value will be stored under the secret 'AWS_ACCESS_KEY_ID'.\n", + "- `aws_secret_access_key`: AWS secret access key. This value will be stored under the secret 'AWS_SECRET_ACCESS_KEY'.\n", + "\n", + "**Optional**\n", + "- `secrets`: Dict to add secrets to naas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d86b8fb-2576-426d-a305-50043c24c23e", + "metadata": { + "papermill": {}, + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Mandatory\n", + "aws_access_key_id = None\n", + "aws_secret_access_key = None\n", + "\n", + "# Optional\n", + "secrets = {\n", + " \"AWS_ACCESS_KEY_ID\": aws_access_key_id,\n", + " \"AWS_SECRET_ACCESS_KEY\": aws_secret_access_key,\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "1b0ae044-cac2-479f-b1fc-a3318696adf5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "3aadae7f-fbe5-4f97-a6a9-6efe9dd1a42f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Add secret" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e235794a-6907-4f0e-ab2b-5aa6668a8d3b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "for secret in secrets:\n", + " new_value = secrets.get(secret)\n", + " if new_value:\n", + " naas.secret.add(secret, secrets.get(secret))" + ] + }, + { + "cell_type": "markdown", + "id": "7c97931b-4ce8-46f9-a70c-45393c5669ee", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "760ec150-d79a-4208-adfe-d0336d443dc8", + "metadata": {}, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4005faa2-a781-4805-9c08-74951e900d12", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = naas.secret.list()\n", + "df = df[df[\"name\"].isin(secrets.keys())]\n", + "df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "naas": { + "notebook_id": "cc22b3eb0484bf2a314634076226daee8a2a74e35de569fa2fbd40dae558222c", + "notebook_path": "GitHub/GitHub_Connect_from_Naas_Chat.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.4.0" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From b885524eaba817c8c112567356436e31e01b04d5 Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 16:31:11 +0100 Subject: [PATCH 08/18] feat: update description --- AWS/AWS_Setup_connection.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AWS/AWS_Setup_connection.ipynb b/AWS/AWS_Setup_connection.ipynb index b660250f70..f323489b85 100644 --- a/AWS/AWS_Setup_connection.ipynb +++ b/AWS/AWS_Setup_connection.ipynb @@ -63,7 +63,7 @@ "tags": [] }, "source": [ - "**Description:** This notebook help you setup your connection with AWS. To access AWS billing using the Python API, you can use the AWS SDK for Python (Boto3). Boto3 provides a comprehensive set of APIs to interact with various AWS services, including billing." + "**Description:** This notebook help you setup your connection with AWS and add required credentials to Naas secret. You will be able to establish a seamless connection to AWS without the need to repeatedly redefine your credentials in variables by using `naas.secret.get()` in your notebook." ] }, { From 4e697b95e758d62343337a1ef18028805f2fef16 Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 16:31:52 +0100 Subject: [PATCH 09/18] feat: update tags --- AWS/AWS_Setup_connection.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AWS/AWS_Setup_connection.ipynb b/AWS/AWS_Setup_connection.ipynb index f323489b85..2dcc966980 100644 --- a/AWS/AWS_Setup_connection.ipynb +++ b/AWS/AWS_Setup_connection.ipynb @@ -30,7 +30,7 @@ "tags": [] }, "source": [ - "**Tags:** #aws #naas #secret #connectors #connection #setup" + "**Tags:** #aws #naas #secret #connection #setup" ] }, { From ad7fef6aad2ddf32bb7c838f0a188d6ad3cbea90 Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 16:43:19 +0100 Subject: [PATCH 10/18] feat: update file path date --- AWS/AWS_Send_daily_biling_notification_to_Slack.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AWS/AWS_Send_daily_biling_notification_to_Slack.ipynb b/AWS/AWS_Send_daily_biling_notification_to_Slack.ipynb index 3c44eb6a6c..e87bddd290 100644 --- a/AWS/AWS_Send_daily_biling_notification_to_Slack.ipynb +++ b/AWS/AWS_Send_daily_biling_notification_to_Slack.ipynb @@ -197,7 +197,7 @@ "\n", "# Optional\n", "cron = \"0 9 * * *\"\n", - "file_path = f\"billing_aws_{date.today().isoformat()}.csv\"" + "file_path = f\"billing_aws_{date.today().isoformat()[:-3]}.csv\"" ] }, { From 8436eb9be1bff6f058df0e8d981886678f2244cb Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 21:31:10 +0100 Subject: [PATCH 11/18] feat: update old templates with new framework --- AWS/AWS_Get_files_from_S3_bucket.ipynb | 150 ++++++++----------------- AWS/AWS_Read_dataframe_from_S3.ipynb | 57 +++++----- AWS/AWS_Send_dataframe_to_S3.ipynb | 82 ++++++++------ AWS/AWS_Upload_file_to_S3_bucket.ipynb | 51 +++++---- 4 files changed, 153 insertions(+), 187 deletions(-) diff --git a/AWS/AWS_Get_files_from_S3_bucket.ipynb b/AWS/AWS_Get_files_from_S3_bucket.ipynb index 8f226da853..986066650e 100644 --- a/AWS/AWS_Get_files_from_S3_bucket.ipynb +++ b/AWS/AWS_Get_files_from_S3_bucket.ipynb @@ -23,7 +23,7 @@ ] }, "source": [ - "# AWS - Get files from S3 bucket\n", + "# AWS - List objects from S3 bucket\n", "

Give Feedback | Bug report" ] }, @@ -37,7 +37,7 @@ ] }, "source": [ - "**Tags:** #aws #cloud #storage #S3bucket #operations #snippet #url" + "**Tags:** #aws #cloud #storage #S3bucket #operations #snippet #list #objects" ] }, { @@ -61,7 +61,7 @@ "tags": [] }, "source": [ - "**Last update:** 2023-04-12 (Created: 2021-09-20)" + "**Last update:** 2023-11-20 (Created: 2021-09-20)" ] }, { @@ -74,7 +74,7 @@ ] }, "source": [ - "**Description:** This notebook provides a step-by-step guide to retrieving files from an Amazon Web Services (AWS) S3 bucket, allowing users to easily access their data stored in the cloud." + "**Description:** This notebook retrieves objects from an Amazon Web Services (AWS) S3 bucket, allowing users to easily access their data stored in the cloud." ] }, { @@ -97,34 +97,6 @@ "## Input" ] }, - { - "cell_type": "markdown", - "id": "a54c7458-f91d-4059-9abf-7a22882f6e9d", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Get_files_from_S3_bucket.ipynb" - ] - }, - "source": [ - "### Install packages" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3c5b955a-86e6-495b-9dea-17d67937f010", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Get_files_from_S3_bucket.ipynb" - ] - }, - "outputs": [], - "source": [ - "!pip install boto3 getpass4" - ] - }, { "cell_type": "markdown", "id": "464ad9fb-2dd8-4267-9e59-3bcf64b23b97", @@ -135,7 +107,7 @@ ] }, "source": [ - "### Import library" + "### Import libraries" ] }, { @@ -150,7 +122,12 @@ }, "outputs": [], "source": [ - "import boto3" + "import naas\n", + "try:\n", + " import boto3\n", + "except:\n", + " !pip install boto3 getpass4\n", + " import boto3" ] }, { @@ -163,7 +140,11 @@ ] }, "source": [ - "### Variables" + "### Setup variables\n", + "**Mandatory**\n", + "- `aws_access_key_id`: This variable is used to store the AWS access key ID.\n", + "- `aws_secret_access_key`: This variable is used to store the AWS secret access key.\n", + "- `bucket_name`: The name of the S3 bucket from which you want to list the files." ] }, { @@ -178,11 +159,10 @@ }, "outputs": [], "source": [ - "ACCESS_KEY_ID = \"**********\"\n", - "SECRET_ACCESS_KEY = \"**********\"\n", - "\n", - "BUCKET_NAME = \"naas-example\"\n", - "BUCKET_OBJECT_KEY = \"naas_happy_hour.mp3\"" + "# Mandatory\n", + "aws_access_key_id = naas.secret.get(\"AWS_ACCESS_KEY_ID\") or \"YOUR_AWS_ACCESS_KEY_ID\"\n", + "aws_secret_access_key = naas.secret.get(\"AWS_SECRET_ACCESS_KEY\") or \"YOUR_AWS_SECRET_ACCESS_KEY\"\n", + "bucket_name = \"naas-example\"" ] }, { @@ -200,65 +180,52 @@ }, { "cell_type": "markdown", - "id": "59711a37-d62a-4ad3-946c-1fefe7f134cd", + "id": "cf014bf3-7ae4-4758-93ee-37c3041db1cf", "metadata": { "papermill": {}, "tags": [ - "awesome-notebooks/AWS/AWS_Get_files_from_S3_bucket.ipynb" + "awesome-notebooks/AWS/AWS_Daily_biling_notification_to_slack.ipynb" ] }, "source": [ - "### Get file" + "### Connect to AWS" ] }, { "cell_type": "code", "execution_count": null, - "id": "b3a6ca15-b5e7-46e7-b74f-438df9cb27db", + "id": "1a6b9c60-4462-406f-9a03-5354c37039f6", "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Get_files_from_S3_bucket.ipynb" - ] + "tags": [] }, "outputs": [], "source": [ - "s3 = boto3.client(\n", - " \"s3\", aws_access_key_id=ACCESS_KEY_ID, aws_secret_access_key=SECRET_ACCESS_KEY\n", - ")\n", - "fileObj = s3.get_object(Bucket=bucketname, Key=filename)" + "s3_client = boto3.client(\n", + " \"s3\",\n", + " aws_access_key_id=aws_access_key_id,\n", + " aws_secret_access_key=aws_secret_access_key\n", + ")" ] }, { "cell_type": "markdown", - "id": "8ad0eac3-939c-49a9-85b0-415c6b13c24d", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Get_files_from_S3_bucket.ipynb" - ] - }, + "id": "ef77d6ed-4118-4f11-be94-656e98d368bb", + "metadata": {}, "source": [ - "### Generate pre-signed URL" + "### List objects in the S3 bucket" ] }, { "cell_type": "code", "execution_count": null, - "id": "d06823bd-23d8-4ca3-9c7b-95ebc9374b3c", + "id": "15fa4ea7-2f54-4c55-8ae9-8aea0df5a734", "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Get_files_from_S3_bucket.ipynb" - ] + "tags": [] }, "outputs": [], "source": [ - "file_url = s3.generate_presigned_url(\n", - " \"get_object\",\n", - " Params={\"Bucket\": BUCKET_NAME, \"Key\": BUCKET_OBJECT_KEY},\n", - " ExpiresIn=604800,\n", - ")" + "response = s3_client.list_objects_v2(Bucket=bucket_name)\n", + "print(\"Results:\", len(response['Contents']))" ] }, { @@ -274,34 +241,6 @@ "## Output" ] }, - { - "cell_type": "markdown", - "id": "40d3f1d6-f46e-4738-ac23-4e2f7472a755", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Get_files_from_S3_bucket.ipynb" - ] - }, - "source": [ - "### Display file" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4ecb13f6-94e1-47c6-a80b-f753b1d0b7d9", - "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Get_files_from_S3_bucket.ipynb" - ] - }, - "outputs": [], - "source": [ - "fileOBJ" - ] - }, { "cell_type": "markdown", "id": "18c8d442-dbff-4900-8048-3ab8a484367e", @@ -318,16 +257,17 @@ { "cell_type": "code", "execution_count": null, - "id": "fdcb928f-1a4d-481a-a635-29a59e035e48", + "id": "ac8286cf-a7d8-4ba1-be47-7a8f7007f4f9", "metadata": { - "papermill": {}, - "tags": [ - "awesome-notebooks/AWS/AWS_Get_files_from_S3_bucket.ipynb" - ] + "tags": [] }, "outputs": [], "source": [ - "file_url" + "# Process the response\n", + "if 'Contents' in response:\n", + " for file in response['Contents']:\n", + " file_name = file['Key']\n", + " print(file_name)" ] } ], @@ -362,4 +302,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/AWS/AWS_Read_dataframe_from_S3.ipynb b/AWS/AWS_Read_dataframe_from_S3.ipynb index 8214f08939..6e068c4239 100644 --- a/AWS/AWS_Read_dataframe_from_S3.ipynb +++ b/AWS/AWS_Read_dataframe_from_S3.ipynb @@ -53,7 +53,7 @@ "tags": [] }, "source": [ - "**Last update:** 2023-04-12 (Created: 2022-04-28)" + "**Last update:** 2023-11-20 (Created: 2022-04-28)" ] }, { @@ -101,11 +101,13 @@ }, "outputs": [], "source": [ + "import naas\n", "try:\n", " import awswrangler as wr\n", "except:\n", " !pip install awswrangler --user\n", - " import awswrangler as wr" + " import awswrangler as wr\n", + "from os import environ" ] }, { @@ -116,7 +118,11 @@ "tags": [] }, "source": [ - "### Setup AWS" + "### Setup variables\n", + "**Mandatory**\n", + "- `aws_access_key_id`: This variable is used to store the AWS access key ID.\n", + "- `aws_secret_access_key`: This variable is used to store the AWS secret access key.\n", + "- `bucket_path`: The name of the S3 bucket from which you want to list the files." ] }, { @@ -129,13 +135,21 @@ }, "outputs": [], "source": [ - "# Credentials\n", - "AWS_ACCESS_KEY_ID = \"YOUR_AWS_ACCESS_KEY_ID\"\n", - "AWS_SECRET_ACCESS_KEY = \"YOUR_AWS_SECRET_ACCESS_KEY\"\n", - "AWS_DEFAULT_REGION = \"YOUR_AWS_DEFAULT_REGION\"\n", - "\n", - "# Bucket\n", - "BUCKET_PATH = f\"s3://naas-data-lake/dataset/\"" + "# Mandatory\n", + "aws_access_key_id = naas.secret.get(\"AWS_ACCESS_KEY_ID\") or \"YOUR_AWS_ACCESS_KEY_ID\"\n", + "aws_secret_access_key = naas.secret.get(\"AWS_SECRET_ACCESS_KEY\") or \"YOUR_AWS_SECRET_ACCESS_KEY\"\n", + "bucket_path = f\"s3://naas-data-lake/example/\"" + ] + }, + { + "cell_type": "markdown", + "id": "8105b836", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" ] }, { @@ -153,7 +167,7 @@ "tags": [] }, "source": [ - "### Setup Env" + "### Set environ" ] }, { @@ -166,20 +180,8 @@ }, "outputs": [], "source": [ - "%env AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID\n", - "%env AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY\n", - "%env AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION" - ] - }, - { - "cell_type": "markdown", - "id": "8105b836", - "metadata": { - "papermill": {}, - "tags": [] - }, - "source": [ - "## Model" + "environ[\"AWS_ACCESS_KEY_ID\"] = aws_access_key_id\n", + "environ[\"AWS_SECRET_ACCESS_KEY\"] = aws_secret_access_key" ] }, { @@ -203,7 +205,8 @@ }, "outputs": [], "source": [ - "df = wr.s3.read_parquet(BUCKET_PATH, dataset=True)" + "df = wr.s3.read_parquet(bucket_path, dataset=True)\n", + "print(\"Rows:\", len(df))" ] }, { @@ -282,4 +285,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/AWS/AWS_Send_dataframe_to_S3.ipynb b/AWS/AWS_Send_dataframe_to_S3.ipynb index 9dc41dc084..fdef6d115b 100644 --- a/AWS/AWS_Send_dataframe_to_S3.ipynb +++ b/AWS/AWS_Send_dataframe_to_S3.ipynb @@ -47,18 +47,18 @@ }, { "cell_type": "markdown", - "id": "ecf0d8f9-b088-429f-b26a-d5b1603c8cde", + "id": "6c3e0f63-a870-49e7-8c3d-c3d112740f8d", "metadata": { "papermill": {}, "tags": [] }, "source": [ - "**Last update:** 2023-04-12 (Created: 2022-04-28)" + "**Last update:** 2023-11-20 (Created: 2022-04-28)" ] }, { "cell_type": "markdown", - "id": "naas-description", + "id": "30937e73-6d14-45f9-9540-5e77b0e80efa", "metadata": { "papermill": {}, "tags": [ @@ -82,7 +82,7 @@ }, { "cell_type": "markdown", - "id": "caa3bb90", + "id": "c4e0537a-4baf-4148-b8f9-de1333a1a0d6", "metadata": { "papermill": {}, "tags": [] @@ -94,55 +94,69 @@ { "cell_type": "code", "execution_count": null, - "id": "745de8d2", + "id": "d87447cd-3a50-44f3-9669-c2333a3af917", "metadata": { "papermill": {}, "tags": [] }, "outputs": [], "source": [ + "import naas\n", "try:\n", " import awswrangler as wr\n", "except:\n", " !pip install awswrangler --user\n", " import awswrangler as wr\n", - "import pandas as pd\n", - "from datetime import date" + "from os import environ\n", + "from datetime import date\n", + "import pandas as pd" ] }, { "cell_type": "markdown", - "id": "e9ce42c4", + "id": "d5495ae4-0c12-4793-ae0e-8e8144be57bf", "metadata": { "papermill": {}, "tags": [] }, "source": [ - "### Setup AWS" + "### Setup variables\n", + "**Mandatory**\n", + "- `aws_access_key_id`: This variable is used to store the AWS access key ID.\n", + "- `aws_secret_access_key`: This variable is used to store the AWS secret access key.\n", + "- `bucket_path`: The name of the S3 bucket from which you want to list the files." ] }, { "cell_type": "code", "execution_count": null, - "id": "4c160ef0", + "id": "587741e3-0006-4db3-9780-1b0a909f61e6", "metadata": { "papermill": {}, "tags": [] }, "outputs": [], "source": [ - "# Credentials\n", - "AWS_ACCESS_KEY_ID = \"YOUR_AWS_ACCESS_KEY_ID\"\n", - "AWS_SECRET_ACCESS_KEY = \"YOUR_AWS_SECRET_ACCESS_KEY\"\n", - "AWS_DEFAULT_REGION = \"YOUR_AWS_DEFAULT_REGION\"\n", - "\n", - "# Bucket\n", - "BUCKET_PATH = f\"s3://naas-data-lake/dataset/\"" + "# Mandatory\n", + "aws_access_key_id = naas.secret.get(\"AWS_ACCESS_KEY_ID\") or \"YOUR_AWS_ACCESS_KEY_ID\"\n", + "aws_secret_access_key = naas.secret.get(\"AWS_SECRET_ACCESS_KEY\") or \"YOUR_AWS_SECRET_ACCESS_KEY\"\n", + "bucket_path = f\"s3://naas-data-lake/example/\"" + ] + }, + { + "cell_type": "markdown", + "id": "612e695e", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" ] }, { "cell_type": "markdown", - "id": "d654e0c4", + "id": "27e095d5-49e0-420c-9d6d-3fd90567867f", "metadata": { "execution": { "iopub.execute_input": "2022-04-21T06:42:00.638182Z", @@ -155,33 +169,21 @@ "tags": [] }, "source": [ - "### Setup Env" + "### Set environ" ] }, { "cell_type": "code", "execution_count": null, - "id": "98e7d0f5", + "id": "f9aac758-d29b-421a-8417-1528e8462fa1", "metadata": { "papermill": {}, "tags": [] }, "outputs": [], "source": [ - "%env AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID\n", - "%env AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY\n", - "%env AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION" - ] - }, - { - "cell_type": "markdown", - "id": "612e695e", - "metadata": { - "papermill": {}, - "tags": [] - }, - "source": [ - "## Model" + "environ[\"AWS_ACCESS_KEY_ID\"] = aws_access_key_id\n", + "environ[\"AWS_SECRET_ACCESS_KEY\"] = aws_secret_access_key" ] }, { @@ -253,8 +255,16 @@ }, "outputs": [], "source": [ - "wr.s3.to_parquet(df=df, path=BUCKET_PATH, dataset=True, mode=\"overwrite\")" + "wr.s3.to_parquet(df=df, path=bucket_path, dataset=True, mode=\"overwrite\")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "362e1dfd-606b-4552-8bc9-128a70b7bdf7", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -297,4 +307,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/AWS/AWS_Upload_file_to_S3_bucket.ipynb b/AWS/AWS_Upload_file_to_S3_bucket.ipynb index 02a1ea8dc3..a83e9b13bc 100644 --- a/AWS/AWS_Upload_file_to_S3_bucket.ipynb +++ b/AWS/AWS_Upload_file_to_S3_bucket.ipynb @@ -53,7 +53,7 @@ "tags": [] }, "source": [ - "**Last update:** 2023-04-12 (Created: 2021-08-03)" + "**Last update:** 2023-11-20 (Created: 2021-08-03)" ] }, { @@ -66,7 +66,7 @@ ] }, "source": [ - "**Description:** This notebook provides instructions on how to upload a file to an Amazon Web Services (AWS) S3 bucket, allowing for secure storage and easy access to the file. It is a simple and efficient way to store and manage data in the cloud." + "**Description:** This notebook upload a file to an Amazon Web Services (AWS) S3 bucket, allowing for secure storage and easy access to the file. It is a simple and efficient way to store and manage data in the cloud." ] }, { @@ -88,7 +88,7 @@ "tags": [] }, "source": [ - "### Import library" + "### Import libraries" ] }, { @@ -101,6 +101,7 @@ }, "outputs": [], "source": [ + "import naas\n", "try:\n", " import boto3\n", "except:\n", @@ -116,7 +117,12 @@ "tags": [] }, "source": [ - "### Variables" + "### Setup variables\n", + "**Mandatory**\n", + "- `aws_access_key_id`: This variable is used to store the AWS access key ID.\n", + "- `aws_secret_access_key`: This variable is used to store the AWS secret access key.\n", + "- `bucket_name`: The name of the S3 bucket from which you want to list the files.\n", + "- `file_path`: The path of the file to be uploaded." ] }, { @@ -129,11 +135,11 @@ }, "outputs": [], "source": [ - "ACCESS_KEY_ID = \"**********\"\n", - "SECRET_ACCESS_KEY = \"**********\"\n", - "\n", - "BUCKET_NAME = \"naas-example\"\n", - "BUCKET_OBJECT_KEY = \"naas_happy_hour.mp3\"" + "# Mandatory\n", + "aws_access_key_id = naas.secret.get(\"AWS_ACCESS_KEY_ID\") or \"YOUR_AWS_ACCESS_KEY_ID\"\n", + "aws_secret_access_key = naas.secret.get(\"AWS_SECRET_ACCESS_KEY\") or \"YOUR_AWS_SECRET_ACCESS_KEY\"\n", + "bucket_name = \"naas-example\"\n", + "file_path = \"AWS_Upload_file_to_S3_bucket.ipynb\"" ] }, { @@ -169,13 +175,15 @@ "outputs": [], "source": [ "s3 = boto3.client(\n", - " \"s3\", aws_access_key_id=ACCESS_KEY_ID, aws_secret_access_key=SECRET_ACCESS_KEY\n", + " \"s3\",\n", + " aws_access_key_id=aws_access_key_id,\n", + " aws_secret_access_key=aws_secret_access_key\n", ")" ] }, { "cell_type": "markdown", - "id": "7d20bb56-d24f-4418-8b0a-2d4e01e8b97b", + "id": "1b13e10a-303b-4f3e-bf53-5e6a2a4acc69", "metadata": { "papermill": {}, "tags": [] @@ -186,11 +194,8 @@ }, { "cell_type": "markdown", - "id": "73cd56cd-0561-438c-949c-e0c6c69c1f9f", - "metadata": { - "papermill": {}, - "tags": [] - }, + "id": "33eea148-a0d8-450a-bf64-1c70d148b9f5", + "metadata": {}, "source": [ "### Upload data" ] @@ -205,9 +210,17 @@ }, "outputs": [], "source": [ - "with open(BUCKET_OBJECT_KEY, \"rb\") as f:\n", - " s3.upload_fileobj(f, BUCKET_NAME, BUCKET_OBJECT_KEY)" + "with open(file_path, \"rb\") as f:\n", + " s3.upload_fileobj(f, bucket_name, file_path)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e0a3288-6c4e-413f-a5a5-a4277d01628a", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -241,4 +254,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} From 2d3fe85e3b1122a6054d8beda61c85db6b9d512e Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 21:37:01 +0100 Subject: [PATCH 12/18] feat: update variable name --- HubSpot/HubSpot_Add_LinkedIn_message_to_contact.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/HubSpot/HubSpot_Add_LinkedIn_message_to_contact.ipynb b/HubSpot/HubSpot_Add_LinkedIn_message_to_contact.ipynb index 19a1debcdf..eae840c80b 100644 --- a/HubSpot/HubSpot_Add_LinkedIn_message_to_contact.ipynb +++ b/HubSpot/HubSpot_Add_LinkedIn_message_to_contact.ipynb @@ -144,7 +144,7 @@ }, "outputs": [], "source": [ - "api_key = naas.secret.get(\"HS_ACCESS_TOKEN\") or \"YOUR_HS_ACCESS_TOKEN\"\n", + "hs_access_token = naas.secret.get(\"HS_ACCESS_TOKEN\") or \"YOUR_HS_ACCESS_TOKEN\"\n", "communication_body = \"My First LinkedIn message\"\n", "contact_id = \"308551\"\n", "communication_datetime = None or datetime(2023, 8, 17, 16, 5, 5)" @@ -235,7 +235,7 @@ " print(res.text)\n", " return data\n", "\n", - "data = create_communication(api_key, communication_body, contact_id, communication_datetime, \"LINKEDIN_MESSAGE\")\n", + "data = create_communication(hs_access_token, communication_body, contact_id, communication_datetime, \"LINKEDIN_MESSAGE\")\n", "data" ] }, @@ -325,4 +325,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} From 432edfce596b4635b81ccba946c4e2ae058566f1 Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 21:40:32 +0100 Subject: [PATCH 13/18] feat: add hubspot setup connection --- HubSpot/HubSpot_Setup_connection.ipynb | 273 +++++++++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 HubSpot/HubSpot_Setup_connection.ipynb diff --git a/HubSpot/HubSpot_Setup_connection.ipynb b/HubSpot/HubSpot_Setup_connection.ipynb new file mode 100644 index 0000000000..6d6ceae832 --- /dev/null +++ b/HubSpot/HubSpot_Setup_connection.ipynb @@ -0,0 +1,273 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "30365585-613f-4b68-9a19-a569797959bf", + "metadata": { + "execution": { + "iopub.execute_input": "2021-02-23T14:22:16.610471Z", + "iopub.status.busy": "2021-02-23T14:22:16.610129Z", + "iopub.status.idle": "2021-02-23T14:22:16.627784Z", + "shell.execute_reply": "2021-02-23T14:22:16.626866Z", + "shell.execute_reply.started": "2021-02-23T14:22:16.610384Z" + }, + "papermill": {}, + "tags": [] + }, + "source": [ + "\"HubSpot.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "a5b2c509-2c29-49e8-af91-4f3f1e386da3", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# HubSpot - Setup connection" + ] + }, + { + "cell_type": "markdown", + "id": "d77fe283-4edd-42d3-a909-8e207d4b842f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #hubspot #naas #secret #connection #setup" + ] + }, + { + "cell_type": "markdown", + "id": "b90f2d91-c886-4e36-8265-b09d06bb1c7f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel)" + ] + }, + { + "cell_type": "markdown", + "id": "6bbf7807-dda4-4b8a-b016-fe258a0fa33f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-20 (Created: 2023-11-20)" + ] + }, + { + "cell_type": "markdown", + "id": "214749fe-7f0b-4755-b7ea-1d200c234cc6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook help you setup your connection with HubSpot and add required credentials to Naas secret. You will be able to establish a seamless connection to AWS without the need to repeatedly redefine your credentials in variables by using `naas.secret.get()` in your notebook." + ] + }, + { + "cell_type": "markdown", + "id": "a1329bea-ad80-4981-874c-8776b11f89a8", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n", + "- [Get your HubSpot Access token](https://knowledge.hubspot.com/articles/kcs_article/integrations/how-do-i-get-my-hubspot-api-key)\n", + "- [Naas Secret Documentation](https://site.naas.ai/docs/developers/jobs/secret)" + ] + }, + { + "cell_type": "markdown", + "id": "cff349c8-2816-4ae4-9229-027c068eeb51", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "80266a9e-fe54-4f3e-aeb2-01483bbc53f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc038b10-2679-42bc-909e-09a298339df4", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import naas" + ] + }, + { + "cell_type": "markdown", + "id": "30127040-e487-4115-8317-5084823b3a6f", + "metadata": { + "papermill": {}, + "tags": [ + "variables" + ] + }, + "source": [ + "### Setup variables\n", + "**Mandatory**\n", + "- `hs_access_token`: This variable stores an access token used for accessing the HubSpot API. This value will be stored under the secret 'HS_ACCESS_TOKEN'.\n", + "\n", + "**Optional**\n", + "- `secrets`: Dict to add secrets to naas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d86b8fb-2576-426d-a305-50043c24c23e", + "metadata": { + "papermill": {}, + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Mandatory\n", + "hs_access_token = None\n", + "\n", + "# Optional\n", + "secrets = {\n", + " \"HS_ACCESS_TOKEN\": hs_access_token,\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "1b0ae044-cac2-479f-b1fc-a3318696adf5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "3aadae7f-fbe5-4f97-a6a9-6efe9dd1a42f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Add secret" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e235794a-6907-4f0e-ab2b-5aa6668a8d3b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "for secret in secrets:\n", + " new_value = secrets.get(secret)\n", + " if new_value:\n", + " naas.secret.add(secret, secrets.get(secret))" + ] + }, + { + "cell_type": "markdown", + "id": "7c97931b-4ce8-46f9-a70c-45393c5669ee", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "760ec150-d79a-4208-adfe-d0336d443dc8", + "metadata": {}, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4005faa2-a781-4805-9c08-74951e900d12", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = naas.secret.list()\n", + "df = df[df[\"name\"].isin(secrets.keys())]\n", + "df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "naas": { + "notebook_id": "cc22b3eb0484bf2a314634076226daee8a2a74e35de569fa2fbd40dae558222c", + "notebook_path": "GitHub/GitHub_Connect_from_Naas_Chat.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.4.0" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From a294daf0b20e9e7715f2a2fc240be61ea02916dc Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 21:44:15 +0100 Subject: [PATCH 14/18] feat: add linkedin connection + fix hubspot description tipo --- HubSpot/HubSpot_Setup_connection.ipynb | 2 +- LinkedIn/LinkedIn_Setup_connection.ipynb | 269 +++++++++++++++++++++++ 2 files changed, 270 insertions(+), 1 deletion(-) create mode 100644 LinkedIn/LinkedIn_Setup_connection.ipynb diff --git a/HubSpot/HubSpot_Setup_connection.ipynb b/HubSpot/HubSpot_Setup_connection.ipynb index 6d6ceae832..6cc92c244b 100644 --- a/HubSpot/HubSpot_Setup_connection.ipynb +++ b/HubSpot/HubSpot_Setup_connection.ipynb @@ -70,7 +70,7 @@ "tags": [] }, "source": [ - "**Description:** This notebook help you setup your connection with HubSpot and add required credentials to Naas secret. You will be able to establish a seamless connection to AWS without the need to repeatedly redefine your credentials in variables by using `naas.secret.get()` in your notebook." + "**Description:** This notebook help you setup your connection with HubSpot and add required credentials to Naas secret. You will be able to establish a seamless connection to HubSpot without the need to repeatedly redefine your credentials in variables by using `naas.secret.get()` in your notebook." ] }, { diff --git a/LinkedIn/LinkedIn_Setup_connection.ipynb b/LinkedIn/LinkedIn_Setup_connection.ipynb new file mode 100644 index 0000000000..61f6600448 --- /dev/null +++ b/LinkedIn/LinkedIn_Setup_connection.ipynb @@ -0,0 +1,269 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9a08b929-eb2d-4382-940b-dcc7cc8cf223", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "\"LinkedIn.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "a5b2c509-2c29-49e8-af91-4f3f1e386da3", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# LinkedIn - Setup connection" + ] + }, + { + "cell_type": "markdown", + "id": "d77fe283-4edd-42d3-a909-8e207d4b842f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #linkedin #naas #secret #connection #setup" + ] + }, + { + "cell_type": "markdown", + "id": "b90f2d91-c886-4e36-8265-b09d06bb1c7f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel)" + ] + }, + { + "cell_type": "markdown", + "id": "6bbf7807-dda4-4b8a-b016-fe258a0fa33f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-20 (Created: 2023-11-20)" + ] + }, + { + "cell_type": "markdown", + "id": "214749fe-7f0b-4755-b7ea-1d200c234cc6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook help you setup your connection with LinkedIn and add required credentials to Naas secret. You will be able to establish a seamless connection to LinkedIn without the need to repeatedly redefine your credentials in variables by using `naas.secret.get()` in your notebook." + ] + }, + { + "cell_type": "markdown", + "id": "a1329bea-ad80-4981-874c-8776b11f89a8", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n", + "- [Learn how to get your cookies on LinkedIn](https://www.notion.so/LinkedIn-driver-Get-your-cookies-d20a8e7e508e42af8a5b52e33f3dba75)\n", + "- [Naas Secret Documentation](https://site.naas.ai/docs/developers/jobs/secret)" + ] + }, + { + "cell_type": "markdown", + "id": "cff349c8-2816-4ae4-9229-027c068eeb51", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "80266a9e-fe54-4f3e-aeb2-01483bbc53f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc038b10-2679-42bc-909e-09a298339df4", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import naas" + ] + }, + { + "cell_type": "markdown", + "id": "30127040-e487-4115-8317-5084823b3a6f", + "metadata": { + "papermill": {}, + "tags": [ + "variables" + ] + }, + "source": [ + "### Setup variables\n", + "**Mandatory**\n", + "- `li_at`: Cookie used to authenticate Members and API clients. This value will be stored under the secret 'LINKEDIN_LI_AT'.\n", + "- `JSESSIONID`: Cookie used for Cross Site Request Forgery (CSRF) protection and URL signature validation. This value will be stored under the secret 'LINKEDIN_JSESSIONID'.\n", + "\n", + "**Optional**\n", + "- `secrets`: Dict to add secrets to naas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d86b8fb-2576-426d-a305-50043c24c23e", + "metadata": { + "papermill": {}, + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Mandatory\n", + "li_at = None\n", + "JSESSIONID = None\n", + "\n", + "# Optional\n", + "secrets = {\n", + " \"LINKEDIN_LI_AT\": li_at,\n", + " \"LINKEDIN_JSESSIONID\": JSESSIONID,\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "1b0ae044-cac2-479f-b1fc-a3318696adf5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "3aadae7f-fbe5-4f97-a6a9-6efe9dd1a42f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Add secret" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e235794a-6907-4f0e-ab2b-5aa6668a8d3b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "for secret in secrets:\n", + " new_value = secrets.get(secret)\n", + " if new_value:\n", + " naas.secret.add(secret, secrets.get(secret))" + ] + }, + { + "cell_type": "markdown", + "id": "7c97931b-4ce8-46f9-a70c-45393c5669ee", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "760ec150-d79a-4208-adfe-d0336d443dc8", + "metadata": {}, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4005faa2-a781-4805-9c08-74951e900d12", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = naas.secret.list()\n", + "df = df[df[\"name\"].isin(secrets.keys())]\n", + "df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "naas": { + "notebook_id": "cc22b3eb0484bf2a314634076226daee8a2a74e35de569fa2fbd40dae558222c", + "notebook_path": "GitHub/GitHub_Connect_from_Naas_Chat.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.4.0" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From eb6c940a767cb3f5f5fac60789425c240908a4f0 Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 21:48:58 +0100 Subject: [PATCH 15/18] feat: add notion connection template --- Notion/Notion_Setup_connection.ipynb | 266 +++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 Notion/Notion_Setup_connection.ipynb diff --git a/Notion/Notion_Setup_connection.ipynb b/Notion/Notion_Setup_connection.ipynb new file mode 100644 index 0000000000..4baf487f93 --- /dev/null +++ b/Notion/Notion_Setup_connection.ipynb @@ -0,0 +1,266 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "947e07eb-28c0-4bed-9524-d8a2249c6ad8", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "\"Notion.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "a5b2c509-2c29-49e8-af91-4f3f1e386da3", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# Notion - Setup connection" + ] + }, + { + "cell_type": "markdown", + "id": "d77fe283-4edd-42d3-a909-8e207d4b842f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #notion #naas #secret #connection #setup" + ] + }, + { + "cell_type": "markdown", + "id": "b90f2d91-c886-4e36-8265-b09d06bb1c7f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel)" + ] + }, + { + "cell_type": "markdown", + "id": "6bbf7807-dda4-4b8a-b016-fe258a0fa33f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-20 (Created: 2023-11-20)" + ] + }, + { + "cell_type": "markdown", + "id": "214749fe-7f0b-4755-b7ea-1d200c234cc6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook help you setup your connection with Notion and add required credentials to Naas secret. You will be able to establish a seamless connection to Notion without the need to repeatedly redefine your credentials in variables by using `naas.secret.get()` in your notebook." + ] + }, + { + "cell_type": "markdown", + "id": "a1329bea-ad80-4981-874c-8776b11f89a8", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n", + "- [Create integration with Notion](https://developers.notion.com/docs/create-a-notion-integration)\n", + "- [Naas Secret Documentation](https://site.naas.ai/docs/developers/jobs/secret)" + ] + }, + { + "cell_type": "markdown", + "id": "cff349c8-2816-4ae4-9229-027c068eeb51", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "80266a9e-fe54-4f3e-aeb2-01483bbc53f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc038b10-2679-42bc-909e-09a298339df4", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import naas" + ] + }, + { + "cell_type": "markdown", + "id": "30127040-e487-4115-8317-5084823b3a6f", + "metadata": { + "papermill": {}, + "tags": [ + "variables" + ] + }, + "source": [ + "### Setup variables\n", + "**Mandatory**\n", + "- `notion_token`: Notion token shared with your database. This value will be stored under the secret 'NOTION_TOKEN'.\n", + "\n", + "**Optional**\n", + "- `secrets`: Dict to add secrets to naas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d86b8fb-2576-426d-a305-50043c24c23e", + "metadata": { + "papermill": {}, + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Mandatory\n", + "notion_token = None\n", + "\n", + "# Optional\n", + "secrets = {\n", + " \"NOTION_TOKEN\": notion_token,\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "1b0ae044-cac2-479f-b1fc-a3318696adf5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "3aadae7f-fbe5-4f97-a6a9-6efe9dd1a42f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Add secret" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e235794a-6907-4f0e-ab2b-5aa6668a8d3b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "for secret in secrets:\n", + " new_value = secrets.get(secret)\n", + " if new_value:\n", + " naas.secret.add(secret, secrets.get(secret))" + ] + }, + { + "cell_type": "markdown", + "id": "7c97931b-4ce8-46f9-a70c-45393c5669ee", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "760ec150-d79a-4208-adfe-d0336d443dc8", + "metadata": {}, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4005faa2-a781-4805-9c08-74951e900d12", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = naas.secret.list()\n", + "df = df[df[\"name\"].isin(secrets.keys())]\n", + "df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "naas": { + "notebook_id": "cc22b3eb0484bf2a314634076226daee8a2a74e35de569fa2fbd40dae558222c", + "notebook_path": "GitHub/GitHub_Connect_from_Naas_Chat.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.4.0" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 210dce8bf3a3ffe658b2838f04ca25c832f7b6f0 Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 21:52:26 +0100 Subject: [PATCH 16/18] feat: add openai template connection --- OpenAI/OpenAI_Setup_connection.ipynb | 273 +++++++++++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 OpenAI/OpenAI_Setup_connection.ipynb diff --git a/OpenAI/OpenAI_Setup_connection.ipynb b/OpenAI/OpenAI_Setup_connection.ipynb new file mode 100644 index 0000000000..86fefccb58 --- /dev/null +++ b/OpenAI/OpenAI_Setup_connection.ipynb @@ -0,0 +1,273 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "be5dd6e3-f6cd-4c02-a6aa-722079e94fdd", + "metadata": { + "execution": { + "iopub.execute_input": "2021-02-23T14:22:16.610471Z", + "iopub.status.busy": "2021-02-23T14:22:16.610129Z", + "iopub.status.idle": "2021-02-23T14:22:16.627784Z", + "shell.execute_reply": "2021-02-23T14:22:16.626866Z", + "shell.execute_reply.started": "2021-02-23T14:22:16.610384Z" + }, + "papermill": {}, + "tags": [] + }, + "source": [ + "\"OpenAI.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "a5b2c509-2c29-49e8-af91-4f3f1e386da3", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# OpenAI - Setup connection" + ] + }, + { + "cell_type": "markdown", + "id": "d77fe283-4edd-42d3-a909-8e207d4b842f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #openai #naas #secret #connection #setup" + ] + }, + { + "cell_type": "markdown", + "id": "b90f2d91-c886-4e36-8265-b09d06bb1c7f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel)" + ] + }, + { + "cell_type": "markdown", + "id": "6bbf7807-dda4-4b8a-b016-fe258a0fa33f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-20 (Created: 2023-11-20)" + ] + }, + { + "cell_type": "markdown", + "id": "214749fe-7f0b-4755-b7ea-1d200c234cc6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook help you setup your connection with OpenAI and add required credentials to Naas secret. You will be able to establish a seamless connection to OpenAI without the need to repeatedly redefine your credentials in variables by using `naas.secret.get()` in your notebook." + ] + }, + { + "cell_type": "markdown", + "id": "a1329bea-ad80-4981-874c-8776b11f89a8", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n", + "- [Where do I find my API Key?](https://help.openai.com/en/articles/4936850-where-do-i-find-my-api-key)\n", + "- [Naas Secret Documentation](https://site.naas.ai/docs/developers/jobs/secret)" + ] + }, + { + "cell_type": "markdown", + "id": "cff349c8-2816-4ae4-9229-027c068eeb51", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "80266a9e-fe54-4f3e-aeb2-01483bbc53f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc038b10-2679-42bc-909e-09a298339df4", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import naas" + ] + }, + { + "cell_type": "markdown", + "id": "30127040-e487-4115-8317-5084823b3a6f", + "metadata": { + "papermill": {}, + "tags": [ + "variables" + ] + }, + "source": [ + "### Setup variables\n", + "**Mandatory**\n", + "- `openai_api_key`: OpenAI API Key. This value will be stored under the secret 'OPENAI_API_KEY'.\n", + "\n", + "**Optional**\n", + "- `secrets`: Dict to add secrets to naas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d86b8fb-2576-426d-a305-50043c24c23e", + "metadata": { + "papermill": {}, + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Mandatory\n", + "openai_api_key = None\n", + "\n", + "# Optional\n", + "secrets = {\n", + " \"OPENAI_API_KEY\": openai_api_key,\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "1b0ae044-cac2-479f-b1fc-a3318696adf5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "3aadae7f-fbe5-4f97-a6a9-6efe9dd1a42f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Add secret" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e235794a-6907-4f0e-ab2b-5aa6668a8d3b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "for secret in secrets:\n", + " new_value = secrets.get(secret)\n", + " if new_value:\n", + " naas.secret.add(secret, secrets.get(secret))" + ] + }, + { + "cell_type": "markdown", + "id": "7c97931b-4ce8-46f9-a70c-45393c5669ee", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "760ec150-d79a-4208-adfe-d0336d443dc8", + "metadata": {}, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4005faa2-a781-4805-9c08-74951e900d12", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = naas.secret.list()\n", + "df = df[df[\"name\"].isin(secrets.keys())]\n", + "df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "naas": { + "notebook_id": "cc22b3eb0484bf2a314634076226daee8a2a74e35de569fa2fbd40dae558222c", + "notebook_path": "GitHub/GitHub_Connect_from_Naas_Chat.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.4.0" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 2e589aa7abe134d3ab03bcb75012397aa2fd85e9 Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 22:02:22 +0100 Subject: [PATCH 17/18] feat: update buffer templates + add connection template --- Buffer/Buffer_Create_draft.ipynb | 6 +- Buffer/Buffer_Send_text_to_Idea.ipynb | 6 +- Buffer/Buffer_Setup_connection.ipynb | 278 ++++++++++++++++++++++++++ 3 files changed, 284 insertions(+), 6 deletions(-) create mode 100644 Buffer/Buffer_Setup_connection.ipynb diff --git a/Buffer/Buffer_Create_draft.ipynb b/Buffer/Buffer_Create_draft.ipynb index 606a12b24c..b6460f8807 100644 --- a/Buffer/Buffer_Create_draft.ipynb +++ b/Buffer/Buffer_Create_draft.ipynb @@ -126,7 +126,7 @@ "### Setup variables\n", "- `buffer_url`: This variable holds the URL of the specific Buffer profile where you want to create a new post. Example: \"https://publish.buffer.com/profile/xxxxxxxxxxx/tab/queue\"\n", "- `text`: This variable contains the text content that you want to post on the Buffer profile. You can modify this string to change the content of the post.\n", - "- `cookie`: This variable is used to store the cookie information from your Buffer session. The `input()` function is used to prompt you to manually enter your cookie information. You need to inspect your Buffer session in your web browser and copy/paste your cookie into the prompt. The cookie is used for authentication and maintaining the session with Buffer." + "- `cookie`: This variable is used to store the cookie information from your Buffer session." ] }, { @@ -141,7 +141,7 @@ "source": [ "buffer_url = \"https://publish.buffer.com/profile/xxxxxxxxxxxxxx/tab/queue\"\n", "text = \"My Draft\"\n", - "cookie = input(\"Inspect your Buffer and Copy/Paste your cookie:\")" + "cookie = naas.secret.get(\"BUFFER_COOKIES\") or \"Inspect your Buffer and Copy/Paste your cookie\"" ] }, { @@ -314,4 +314,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/Buffer/Buffer_Send_text_to_Idea.ipynb b/Buffer/Buffer_Send_text_to_Idea.ipynb index c1f651efa6..f087ea7158 100644 --- a/Buffer/Buffer_Send_text_to_Idea.ipynb +++ b/Buffer/Buffer_Send_text_to_Idea.ipynb @@ -126,7 +126,7 @@ "### Setup variables\n", "- `buffer_url`: This variable holds the URL of the specific Buffer profile where you want to create a new post. Example: \"https://publish.buffer.com/profile/xxxxxxxxxxx/tab/queue\"\n", "- `text`: This variable contains the text content that you want to post on the Buffer profile. You can modify this string to change the content of the post.\n", - "- `cookie`: This variable is used to store the cookie information from your Buffer session. The `input()` function is used to prompt you to manually enter your cookie information. You need to inspect your Buffer session in your web browser and copy/paste your cookie into the prompt. The cookie is used for authentication and maintaining the session with Buffer." + "- `cookie`: This variable is used to store the cookie information from your Buffer session." ] }, { @@ -141,7 +141,7 @@ "source": [ "organization_id = \"xxxxxxx\"\n", "text = \"My Buffer Idea\"\n", - "cookie = input(\"Inspect your Buffer and Copy/Paste your cookie:\")" + "cookie = naas.secret.get(\"BUFFER_COOKIES\") or \"Inspect your Buffer and Copy/Paste your cookie\"" ] }, { @@ -323,4 +323,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/Buffer/Buffer_Setup_connection.ipynb b/Buffer/Buffer_Setup_connection.ipynb new file mode 100644 index 0000000000..dfefdec7d6 --- /dev/null +++ b/Buffer/Buffer_Setup_connection.ipynb @@ -0,0 +1,278 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "02b78a46-e367-48fb-9468-d560000cc994", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "\"Buffer.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "a5b2c509-2c29-49e8-af91-4f3f1e386da3", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# Buffer - Setup connection" + ] + }, + { + "cell_type": "markdown", + "id": "d77fe283-4edd-42d3-a909-8e207d4b842f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #buffer #naas #secret #connection #setup" + ] + }, + { + "cell_type": "markdown", + "id": "b90f2d91-c886-4e36-8265-b09d06bb1c7f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel)" + ] + }, + { + "cell_type": "markdown", + "id": "6bbf7807-dda4-4b8a-b016-fe258a0fa33f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-20 (Created: 2023-11-20)" + ] + }, + { + "cell_type": "markdown", + "id": "214749fe-7f0b-4755-b7ea-1d200c234cc6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook help you setup your connection with Buffer and add required credentials to Naas secret. You will be able to establish a seamless connection to Buffer without the need to repeatedly redefine your credentials in variables by using `naas.secret.get()` in your notebook." + ] + }, + { + "cell_type": "markdown", + "id": "a1329bea-ad80-4981-874c-8776b11f89a8", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n", + "- [Generate a personal access token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)\n", + "- [Naas Secret Documentation](https://site.naas.ai/docs/developers/jobs/secret)" + ] + }, + { + "cell_type": "markdown", + "id": "cff349c8-2816-4ae4-9229-027c068eeb51", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "80266a9e-fe54-4f3e-aeb2-01483bbc53f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc038b10-2679-42bc-909e-09a298339df4", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import naas" + ] + }, + { + "cell_type": "markdown", + "id": "30127040-e487-4115-8317-5084823b3a6f", + "metadata": { + "papermill": {}, + "tags": [ + "variables" + ] + }, + "source": [ + "### Setup variables\n", + "**Pre-requisite**\n", + "\n", + "You need to inspect your Buffer session in your web browser and copy/paste your cookie in the variable below. The cookie will be used for authentication and maintaining the session with Buffer.\n", + "\n", + "**Mandatory**\n", + "- `buffer_cookies`: This variable is used to store the cookie information from your Buffer session. This value will be stored under the secret 'BUFFER_COOKIES'.\n", + "\n", + "**Optional**\n", + "- `secrets`: Dict to add secrets to naas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d86b8fb-2576-426d-a305-50043c24c23e", + "metadata": { + "papermill": {}, + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Mandatory\n", + "buffer_cookies = None\n", + "\n", + "# Optional\n", + "secrets = {\n", + " \"BUFFER_COOKIES\": buffer_cookies,\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "1b0ae044-cac2-479f-b1fc-a3318696adf5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "3aadae7f-fbe5-4f97-a6a9-6efe9dd1a42f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Add secret" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e235794a-6907-4f0e-ab2b-5aa6668a8d3b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "for secret in secrets:\n", + " new_value = secrets.get(secret)\n", + " if new_value:\n", + " naas.secret.add(secret, secrets.get(secret))" + ] + }, + { + "cell_type": "markdown", + "id": "7c97931b-4ce8-46f9-a70c-45393c5669ee", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "760ec150-d79a-4208-adfe-d0336d443dc8", + "metadata": {}, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4005faa2-a781-4805-9c08-74951e900d12", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = naas.secret.list()\n", + "df = df[df[\"name\"].isin(secrets.keys())]\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3cb18d4d-cd69-49b5-92ea-4b638885e652", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "naas": { + "notebook_id": "cc22b3eb0484bf2a314634076226daee8a2a74e35de569fa2fbd40dae558222c", + "notebook_path": "GitHub/GitHub_Connect_from_Naas_Chat.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.4.0" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 1cf6415916706ab319dbc731cc8fb169e94773df Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Mon, 20 Nov 2023 22:02:59 +0100 Subject: [PATCH 18/18] feat: add github connection template --- GitHub/GitHub_Setup_connection.ipynb | 266 +++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 GitHub/GitHub_Setup_connection.ipynb diff --git a/GitHub/GitHub_Setup_connection.ipynb b/GitHub/GitHub_Setup_connection.ipynb new file mode 100644 index 0000000000..00d3e9aaf3 --- /dev/null +++ b/GitHub/GitHub_Setup_connection.ipynb @@ -0,0 +1,266 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "712c8bab-db51-4f89-9522-905ca8a0c189", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "\"GitHub.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "a5b2c509-2c29-49e8-af91-4f3f1e386da3", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# GitHub - Setup connection" + ] + }, + { + "cell_type": "markdown", + "id": "d77fe283-4edd-42d3-a909-8e207d4b842f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #github #naas #secret #connection #setup" + ] + }, + { + "cell_type": "markdown", + "id": "b90f2d91-c886-4e36-8265-b09d06bb1c7f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel)" + ] + }, + { + "cell_type": "markdown", + "id": "6bbf7807-dda4-4b8a-b016-fe258a0fa33f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-20 (Created: 2023-11-20)" + ] + }, + { + "cell_type": "markdown", + "id": "214749fe-7f0b-4755-b7ea-1d200c234cc6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook help you setup your connection with GitHub and add required credentials to Naas secret. You will be able to establish a seamless connection to GitHub without the need to repeatedly redefine your credentials in variables by using `naas.secret.get()` in your notebook." + ] + }, + { + "cell_type": "markdown", + "id": "a1329bea-ad80-4981-874c-8776b11f89a8", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n", + "- [Generate a personal access token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)\n", + "- [Naas Secret Documentation](https://site.naas.ai/docs/developers/jobs/secret)" + ] + }, + { + "cell_type": "markdown", + "id": "cff349c8-2816-4ae4-9229-027c068eeb51", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "80266a9e-fe54-4f3e-aeb2-01483bbc53f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc038b10-2679-42bc-909e-09a298339df4", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import naas" + ] + }, + { + "cell_type": "markdown", + "id": "30127040-e487-4115-8317-5084823b3a6f", + "metadata": { + "papermill": {}, + "tags": [ + "variables" + ] + }, + "source": [ + "### Setup variables\n", + "**Mandatory**\n", + "- `github_token`: GitHub personal access token. This value will be stored under the secret 'GITHUB_TOKEN'.\n", + "\n", + "**Optional**\n", + "- `secrets`: Dict to add secrets to naas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d86b8fb-2576-426d-a305-50043c24c23e", + "metadata": { + "papermill": {}, + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Mandatory\n", + "github_token = None\n", + "\n", + "# Optional\n", + "secrets = {\n", + " \"GITHUB_TOKEN\": github_token,\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "1b0ae044-cac2-479f-b1fc-a3318696adf5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "3aadae7f-fbe5-4f97-a6a9-6efe9dd1a42f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Add secret" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e235794a-6907-4f0e-ab2b-5aa6668a8d3b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "for secret in secrets:\n", + " new_value = secrets.get(secret)\n", + " if new_value:\n", + " naas.secret.add(secret, secrets.get(secret))" + ] + }, + { + "cell_type": "markdown", + "id": "7c97931b-4ce8-46f9-a70c-45393c5669ee", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "760ec150-d79a-4208-adfe-d0336d443dc8", + "metadata": {}, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4005faa2-a781-4805-9c08-74951e900d12", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = naas.secret.list()\n", + "df = df[df[\"name\"].isin(secrets.keys())]\n", + "df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "naas": { + "notebook_id": "cc22b3eb0484bf2a314634076226daee8a2a74e35de569fa2fbd40dae558222c", + "notebook_path": "GitHub/GitHub_Connect_from_Naas_Chat.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.4.0" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}