');mask-image:url('data:image/svg+xml;charset=utf-8, ');width:16px}.markdown-body details,.markdown-body figcaption,.markdown-body figure{display:block}.markdown-body summary{display:list-item}.markdown-body [hidden]{display:none!important}.markdown-body a{background-color:transparent;color:#0969da;text-decoration:none}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-body b,.markdown-body strong{font-weight:600}.markdown-body dfn{font-style:italic}.markdown-body h1{border-bottom:1px solid #d8dee4;font-size:2em;font-weight:600;margin:.67em 0;padding-bottom:.3em}.markdown-body mark{background-color:#fff8c5;color:#24292f}.markdown-body small{font-size:90%}.markdown-body sub,.markdown-body sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-body sub{bottom:-.25em}.markdown-body sup{top:-.5em}.markdown-body img{background-color:#fff;border-style:none;box-sizing:content-box;max-width:100%}.markdown-body code,.markdown-body kbd,.markdown-body pre,.markdown-body samp{font-family:monospace,monospace;font-size:1em}.markdown-body figure{margin:1em 40px}.markdown-body hr{background:transparent;background-color:#d0d7de;border:0;box-sizing:content-box;height:.25em;margin:24px 0;overflow:hidden;padding:0}.markdown-body input{font:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible}.markdown-body [type=button],.markdown-body [type=reset],.markdown-body [type=submit]{-webkit-appearance:button}.markdown-body [type=button]::-moz-focus-inner,.markdown-body [type=reset]::-moz-focus-inner,.markdown-body [type=submit]::-moz-focus-inner{border-style:none;padding:0}.markdown-body [type=button]:-moz-focusring,.markdown-body [type=reset]:-moz-focusring,.markdown-body [type=submit]:-moz-focusring{outline:1px dotted ButtonText}.markdown-body [type=checkbox],.markdown-body [type=radio]{box-sizing:border-box;padding:0}.markdown-body [type=number]::-webkit-inner-spin-button,.markdown-body [type=number]::-webkit-outer-spin-button{height:auto}.markdown-body [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.markdown-body [type=search]::-webkit-search-cancel-button,.markdown-body [type=search]::-webkit-search-decoration{-webkit-appearance:none}.markdown-body ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-body ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.markdown-body a:hover{text-decoration:underline}.markdown-body hr:after,.markdown-body hr:before{content:"";display:table}.markdown-body hr:after{clear:both}.markdown-body table{border-collapse:collapse;border-spacing:0;display:block;max-width:100%;overflow:auto;width:-webkit-max-content;width:-moz-max-content;width:max-content}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>:not(summary){display:none!important}.markdown-body kbd{background-color:#f6f8fa;border:1px solid rgba(175,184,193,.2);border-radius:6px;box-shadow:inset 0 -1px 0 rgba(175,184,193,.2);color:#24292f;display:inline-block;font:11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;line-height:10px;padding:3px 5px;vertical-align:middle}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:600;line-height:1.25;margin-bottom:16px;margin-top:24px}.markdown-body h2{border-bottom:1px solid #d8dee4;font-size:1.5em;font-weight:600;padding-bottom:.3em}.markdown-body h3{font-size:1.25em;font-weight:600}.markdown-body h4{font-size:1em;font-weight:600}.markdown-body h5{font-size:.875em;font-weight:600}.markdown-body h6{color:#57606a;font-size:.85em;font-weight:600}.markdown-body p{margin-bottom:10px;margin-top:0}.markdown-body blockquote{border-left:.25em solid #d0d7de;color:#57606a;margin:0;padding:0 1em}.markdown-body ol,.markdown-body ul{margin-bottom:0;margin-top:0;padding-left:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code,.markdown-body pre,.markdown-body tt{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}.markdown-body pre{word-wrap:normal;margin-bottom:0;margin-top:0}.markdown-body .octicon{fill:currentColor;display:inline-block;overflow:visible!important;vertical-align:text-bottom}.markdown-body ::-moz-placeholder{color:#6e7781;opacity:1}.markdown-body :-ms-input-placeholder{color:#6e7781;opacity:1}.markdown-body ::placeholder{color:#6e7781;opacity:1}.markdown-body input::-webkit-inner-spin-button,.markdown-body input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}.markdown-body .pl-c{color:#6e7781}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:#0550ae}.markdown-body .pl-e,.markdown-body .pl-en{color:#8250df}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:#24292f}.markdown-body .pl-ent{color:#116329}.markdown-body .pl-k{color:#cf222e}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:#0a3069}.markdown-body .pl-smw,.markdown-body .pl-v{color:#953800}.markdown-body .pl-bu{color:#82071e}.markdown-body .pl-ii{background-color:#82071e;color:#f6f8fa}.markdown-body .pl-c2{background-color:#cf222e;color:#f6f8fa}.markdown-body .pl-sr .pl-cce{color:#116329;font-weight:700}.markdown-body .pl-ml{color:#3b2300}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{color:#0550ae;font-weight:700}.markdown-body .pl-mi{color:#24292f;font-style:italic}.markdown-body .pl-mb{color:#24292f;font-weight:700}.markdown-body .pl-md{background-color:#ffebe9;color:#82071e}.markdown-body .pl-mi1{background-color:#dafbe1;color:#116329}.markdown-body .pl-mc{background-color:#ffd8b5;color:#953800}.markdown-body .pl-mi2{background-color:#0550ae;color:#eaeef2}.markdown-body .pl-mdr{color:#8250df;font-weight:700}.markdown-body .pl-ba{color:#57606a}.markdown-body .pl-sg{color:#8c959f}.markdown-body .pl-corl{color:#0a3069;text-decoration:underline}.markdown-body [data-catalyst]{display:block}.markdown-body g-emoji{font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:400;line-height:1;vertical-align:-.075em}.markdown-body g-emoji img{height:1em;width:1em}.markdown-body:after,.markdown-body:before{content:"";display:table}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#cf222e}.markdown-body .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body details,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-bottom:16px;margin-top:0}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body sup>a:before{content:"["}.markdown-body sup>a:after{content:"]"}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#24292f;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit;padding:0 .2em}.markdown-body ol.no-list,.markdown-body ul.no-list{list-style-type:none;padding:0}.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body ol[type=a]{list-style-type:lower-alpha}.markdown-body ol[type=i]{list-style-type:lower-roman}.markdown-body div>ol:not([type]){list-style-type:decimal}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-bottom:0;margin-top:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:600;margin-top:16px;padding:0}.markdown-body dl dd{margin-bottom:16px;padding:0 16px}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{border:1px solid #d0d7de;padding:6px 13px}.markdown-body table tr{background-color:#fff;border-top:1px solid #d8dee4}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body table img{background-color:transparent}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{background-color:transparent;max-width:none;vertical-align:text-top}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{border:1px solid #d0d7de;display:block;float:left;margin:13px 0 0;overflow:hidden;padding:7px;width:auto}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{clear:both;color:#24292f;display:block;padding:5px 0 0}.markdown-body span.align-center{clear:both;display:block;overflow:hidden}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{clear:both;display:block;overflow:hidden}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{background-color:rgba(175,184,193,.2);border-radius:6px;font-size:85%;margin:0;padding:.2em .4em}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre code{font-size:100%}.markdown-body pre>code{background:transparent;border:0;margin:0;padding:0;white-space:pre;word-break:normal}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{background-color:#f6f8fa;border-radius:6px;font-size:85%;line-height:1.45;overflow:auto;padding:16px}.markdown-body pre code,.markdown-body pre tt{word-wrap:normal;background-color:transparent;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0}.markdown-body .csv-data td,.markdown-body .csv-data th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{background:#fff;border:0;padding:10px 8px 9px;text-align:right}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{background:#f6f8fa;border-top:0;font-weight:600}.markdown-body .footnotes{border-top:1px solid #d0d7de;color:#57606a;font-size:12px}.markdown-body .footnotes ol{padding-left:16px}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target:before{border:2px solid #0969da;border-radius:6px;bottom:-8px;content:"";left:-24px;pointer-events:none;position:absolute;right:-8px;top:-8px}.markdown-body .footnotes li:target{color:#24292f}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item label{font-weight:400}.markdown-body .task-list-item.enabled label{cursor:pointer}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item .handle{display:none}.markdown-body .task-list-item-checkbox{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body ::-webkit-calendar-picker-indicator{filter:invert(50%)}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-family:helvetica,sans-serif;font-style:normal;font-weight:100;max-width:100%;overflow-x:hidden}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{-webkit-text-decoration-skip:objects;background-color:transparent;color:#187cff}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:1.5em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{background-color:#e8e8e8;font-family:hack,monospace,monospace;font-size:.9em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}html{box-sizing:border-box;font:112.5%/1.45em helvetica,sans-serif;overflow-y:scroll}*,:after,:before{box-sizing:inherit}body{word-wrap:break-word;-ms-font-feature-settings:"kern","liga","clig","calt";font-feature-settings:"kern","liga","clig","calt";color:rgba(0,0,0,.8);font-family:helvetica,sans-serif;font-kerning:normal;font-weight:400}ul{margin-top:10px!important;text-align:left}li{color:#333;font-family:helvetica,sans-serif;font-size:.9em;margin-bottom:0!important;padding:0}.shadow-hover{transition:transform .3s ease-in-out,box-shadow .3s ease-in-out}.shadow-hover:hover{box-shadow:3px 4px 12px 4px rgba(0,0,0,.1);margin-bottom:"10px";transform:scale(1.02)}ul.checkmark>li{align-items:center;display:flex}ul.checkmark>li:before{background-image:url("data:image/svg+xml;utf8, ");background-repeat:no-repeat;background-size:contain;color:#999;content:"";display:inline-block;height:1em;margin-right:.5em;width:1em}ul.checkmark>li{color:#666}ul.checkmark>li>strong{color:#000}img{margin:0 0 1.45rem;max-width:100%;padding:0}h1{font-size:1.6rem;letter-spacing:-2px}h1,h2{text-rendering:optimizeLegibility;color:inherit;font-family:helvetica,sans-serif;font-weight:700;line-height:1.1;margin:0 0 1.45rem;padding:0}h2{font-size:1.62671rem;letter-spacing:-1px}h3{font-size:1.38316rem}h3,h4{text-rendering:optimizeLegibility;color:inherit;font-family:helvetica,sans-serif;font-weight:700;line-height:1.1;margin:0 0 1.45rem;padding:0}h4{font-size:1rem}h5{font-size:.85028rem}h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:helvetica,sans-serif;font-weight:700;line-height:1.1;margin:0 0 1.45rem;padding:0}h6{font-size:.78405rem}hgroup{margin:0 0 1.45rem;padding:0}ul{margin:0 0 1.45rem 1.3rem}ol,ul{list-style-image:none;list-style-position:outside;padding:0}ol{margin:0 0 1.45rem 1.45rem}dd,dl{margin:0 0 1.45rem}dd,dl,p{padding:0}p{font-family:Inter,helvetica,sans-serif;font-size:.9em;font-weight:400;margin:0 0 1.25rem}figure{margin:0 0 1.45rem;padding:0}pre{word-wrap:normal;background:transparent;border-radius:3px;font-size:.85rem;line-height:1.42;margin:0 0 1rem;overflow:auto;padding:.5rem 1rem}table{border-collapse:collapse;font-size:1rem;line-height:1.45rem;width:100%}fieldset,table{margin:0 0 1.45rem;padding:0}blockquote{margin:0 1.45rem 1.45rem;padding:0}form,iframe,noscript{margin:0 0 1.45rem;padding:0}hr{background:rgba(0,0,0,.2);border:none;height:1px;margin:0 0 calc(1.45rem - 1px);padding:0}address{margin:0 0 1.45rem;padding:0}b,dt,strong,th{font-weight:700}li{margin-bottom:.725rem}ol li,ul li{padding-left:0}li>ol,li>ul{margin-bottom:.725rem;margin-left:1.45rem;margin-top:.725rem}blockquote :last-child,li :last-child,p :last-child{margin-bottom:0}li>p{margin-bottom:.725rem}code{line-height:1.45rem}kbd,samp{font-size:.85rem;line-height:1.45rem}abbr,abbr[title],acronym{border-bottom:1px dotted rgba(0,0,0,.5);cursor:help}abbr[title]{text-decoration:none}td,th,thead{text-align:left}td,th{font-feature-settings:"tnum";-moz-font-feature-settings:"tnum";-ms-font-feature-settings:"tnum";-webkit-font-feature-settings:"tnum";border-bottom:1px solid rgba(0,0,0,.12);padding:.725rem .96667rem calc(.725rem - 1px)}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}@media only screen and (max-width:480px){html{font-size:100%}}code[class*=language-],pre[class*=language-]{color:#c5c8c6;direction:ltr;font-family:Inconsolata,Monaco,Consolas,Courier New,Courier,monospace;font-size:14px;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;text-align:left;text-shadow:0 1px rgba(0,0,0,.3);white-space:pre;word-break:normal;word-spacing:normal}.npm__react-simple-code-editor__textarea{color:transparent!important;padding:18px!important}pre[class*=language-]{border-radius:.3em;margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#1d1f21}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#7c7c7c}.token.punctuation{color:#c5c8c6}.namespace{opacity:.7}.token.keyword{color:#ff79c6}.token.class-name,.token.function,.token.property,.token.tag{color:#66d9ef}.token.boolean,.token.constant{color:#bd93f9}.token.deleted,.token.symbol{color:#f92672}.token.number{color:#ff73fd}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#f1fa8c}.token.variable{color:#c6c5fe}.token.operator{color:#ededed}.token.entity{color:#ffffb6;cursor:help}.token.url{color:#96cbfe}.language-css .token.string,.style .token.string{color:#87c38a}.token.atrule,.token.attr-value{color:#f9ee98}.token.regex{color:#e9c062}.token.important{color:#fd971f}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.dynobase-download-button-btn:hover{box-shadow:0 2px 4px 0 #8890c3,0 5px 15px 0 rgba(37,44,97,.55)!important;transform:translateY(-2px) scale(1.05)}.dynobase-download-button-btn{transition:all .2s}.dynobase-error-page-pre-bg{background:rgba(0,0,0,.04)}.filter-choice-small{background-color:rgba(24,124,255,.2);border-radius:10px;font-weight:700;margin-bottom:14px;margin-right:auto;margin-top:12px;padding:3px 10px;transition:background-color .33s,color .33s}.filter-choice-small>p{font-weight:700}@media (max-width:801px){.filter-choice{margin-left:0;margin-right:0;margin-top:10px}}.filter-choice{border:2px solid #187cff;border-radius:10px;margin-bottom:10px;margin-left:10px!important;margin-right:10px!important;margin-top:10px;padding:4px 12px;text-decoration:none;transition:background-color .33s,color .33s}.filter-choice,.filter-choice>p{font-weight:700}.filter-choice:hover>p{color:#fff!important}.filter-choice:hover{background-color:#187cff;border-radius:10px;font-weight:700;padding:4px 12px}.model-card{background:#fff;border-radius:6px;box-shadow:0 .3rem .8rem rgba(0,0,0,.12);color:"black";margin-bottom:15px;overflow:hidden;transition:.2s}.model-card:hover{box-shadow:3px 4px 12px 4px rgba(0,0,0,.16)}.tutorial-card{background:#fff;border-radius:6px;box-shadow:0 .3rem .8rem rgba(0,0,0,.12);color:"black";margin-bottom:15px;overflow:hidden;padding:2.2rem;transition:.2s}.tutorial-card:hover{box-shadow:3px 4px 12px 4px rgba(0,0,0,.16)}#dynamodb-releases tr th:first-child{width:12%}@media only screen and (max-width:968px){#dynamodb-releases tr th:first-child{width:15%}}@media only screen and (max-width:500px){#dynamodb-releases tr th:first-child{width:25%}}@media only screen and (max-width:1440px){.side-cta{display:none}}#dynamodb-releases tbody tr td a{text-decoration:none}.reactable-pagination a{padding-right:12px}.key-img{margin:0;text-align:center;width:50%}.link{color:var(--color-text);cursor:pointer;font-size:18px;position:relative;white-space:nowrap}.link:after,.link:before{background:currentColor;height:2px;left:0;pointer-events:none;position:absolute;top:100%;width:100%}.link:before{content:""}.link--metis:before{transform:scaleX(0);transform-origin:100% 50%;transition:transform .3s}.link--metis:hover:before{transform:scaleX(1);transform-origin:0 50%}.my-masonry-grid{display:flex;margin-left:-10px;width:auto}.my-masonry-grid_column{background-clip:padding-box;padding-left:10px}.my-masonry-grid_column>div{margin-bottom:10px}svg.testimonial-arrow{height:160px;margin:0 auto;width:160px}.draw-arrow{stroke-width:5;stroke:#1e90ff;fill:none;stroke-dasharray:400;stroke-dashoffset:400;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-name:draw;animation-name:draw}.draw-arrow.tail-1{-webkit-animation-delay:.5s;animation-delay:.5s}.draw-arrow.tail-2{-webkit-animation-delay:.7s;animation-delay:.7s}@-webkit-keyframes draw{to{stroke-dashoffset:0}}@keyframes draw{to{stroke-dashoffset:0}}.testimonials-arrow-container{display:none;margin-top:24px}@media only screen and (min-width:1200px){.testimonials-arrow-container{display:block!important}}@media only screen and (min-width:1500px){.table-of-contents{display:block!important}}.table-of-contents{display:none;transition:all .2s ease-in}.code-block-copy-to-clipboard:hover{background-color:#fff}.mdx-article h2{margin-top:2em}.mdx-article h3{margin-top:1.5em}@media only screen and (max-width:500px){.list-item-with-spacing{margin-bottom:4px!important}.h1-smaller-on-mobile{font-size:1.7rem!important;margin-top:32px!important}.mobile-friendly-big-feature{margin:0 -100px!important;padding:50px 100px 0!important}.unleash-the-power-headline{font-size:1.8rem!important}}
Using a VPC with DynamoDB - The Why & How-To Using a VPC with DynamoDB - The Why & How-To Still using AWS console to work with DynamoDB? 🙈
Time to
10x your DynamoDB productivity with Dynobase
[learn more] What is VPC? Virtual Private Cloud (VPC) is a virtual network that we can create in AWS. It provides complete control over the network, including the following:
IP address range. Creation of Subnets. Control the inbound and outbound network traffic.
This article mainly talks about accessing DynamoDB from the resources placed inside a VPC.
Why Do We Use VPC with DynamoDB? Let's take a web application hosted in AWS that uses DynamoDB as the database. Inside the VPC, we can have multiple availability zones, and each of these availability zones has one or more subnets. The resources we place inside the subnet will get an IP address from the IP range allocated to the subnet. These could be public or private, depending on whether they are exposed to the internet or not. Here, the main purpose is to define a network boundary around the resources for security.
Suppose that we place an EC2 instance within the subnet and it needs to access DynamoDB. Traditionally, the database call will route through the DynamoDB public IP range. Even for a private subnet, we need to attach a NAT Gateway for that to work. That means the database request will cross the subnet and VPC boundary to the internet.
Still, with the access control in place with DynamoDB and SSL/TLS to encrypt traffic, no major security issue is there. However, for some of the compliance reasons and advanced security, it might require to avoid crossing the VPC boundary completely.
But is there a way we can still keep the traffic routed securely to DynamoDB at the network level?
DynamoDB VPC Endpoint VPC endpoints for DynamoDB make it possible to define a secure path to access DynamoDB from a VPC. It even enables Amazon EC2 instances in a VPC to use their private IP addresses to access DynamoDB with no exposure to the public internet.
Image reference
DynamoDB VPC Endpoint Performance Using the VPC endpoint for DynamoDB will also improve the application performance since it allows a direct connection from VPC to DynamoDB. For instance, you can avoid Database traffic going through the NAT Gateways for private subnets, where it won't become a bottleneck for performance. Additionally, this setup can reduce latency and improve the overall efficiency of your application by minimizing the number of network hops required to reach DynamoDB.
VPC Endpoint for DynamoDB - Policies The VPC endpoint has a policy that can create access limitations to DynamoDB. Initially, the policy would allow access to any user or service within the VPC using credentials from any AWS account to any DynamoDB resource. An endpoint policy is an IAM policy that you attach to an endpoint that allows access to some or all of your associated services.
The code below shows how to create a read-only endpoint to the database table.
{
"Statement" : [
{
"Sid" : "ReadOnly" ,
"Principal" : "*" ,
"Action" : [
"dynamodb:DescribeTable" ,
"dynamodb:ListTables"
] ,
"Effect" : "Allow" ,
"Resource" : "*"
}
]
}
How-To Add a VPC Endpoint for DynamoDB? The following steps will connect the DynamoDB and EC2 instance in the VPC using the VPC endpoint.
Prerequisite steps: Launch the EC2 instance(make EC2 instance available) and ensure that its state is running. This link will provide a step-by-step guide for it. Configure the Amazon EC2 Instance to set a VPC endpoint for the database. This link will provide more details. Step 01 To ensure DynamoDB communication is working fine, test to access with a public endpoint. The below will help to test it. aws dynamodb list-tables
Step 02 Check whether DynamoDB is an available AWS service within the region. aws ec2 describe-vpc-endpoint-services
{
"ServiceNames" : [
"com.amazonaws.us-east-1.dynamodb" ,
"_comment" : "any other available services"
]
}
Step 03 aws ec2 describe-vpcs
{
"Vpcs" : [
{
"VpcId" : "vpc-0bbc736e" ,
"InstanceTenancy" : "default" ,
"State" : "available" ,
"DhcpOptionsId" : "xxxx" ,
"CidrBlock" : "xxxx" ,
"IsDefault" : true
}
]
}
Step 04 Creating the VPC endpoint for found VPC ID. Here VPC ID is vpc-0bbc736e
aws ec2 create-vpc-endpoint --vpc-id vpc-0bbc736e --service-name com.amazonaws.us-east-1.dynamodb --route-table-ids rtb-11aa22bb
Step 05 Verify the access using the VPC endpoint. aws dynamodb list-tables
Appsync - DynamoDB - VPC endpoint AWS AppSync is a fully managed service that facilitates the development of GraphQL APIs. Front-end developers mainly benefit from this service as it can handle heavy queries by securely connecting to data sources such as AWS DynamoDB. Our main application can be hosted in the EC2 instance inside the VPC, AppSync, and connect to the VPC endpoint. Making a GraphQL API heavily useful in the front-end will create a connection between AppSync and DynamoDB using the VPC endpoint.
AWS Lambda with VPC for DynamoDB Lambda and DynamoDB run in the AWS Cloud. Both can work outside VPCs. However, if the Lambda function needs to access resources in a VPC, we might need to place it there. But, it will also create a similar challenge like an EC2 instance if the same Lambda function needs to access DynamoDB.
We can use VPC endpoints to solve this challenge as well. By configuring a VPC endpoint, the Lambda function can securely and efficiently access DynamoDB without traversing the public internet, thus maintaining compliance and enhancing security.
AWS Data Pipeline and Usage of VPC To better understand the topic, you need to understand what is meant by a data pipeline. AWS Data Pipeline is a web service that you can use to automate data transformations. Also, with the AWS Data Pipeline, you can define data-driven workflows and schedules, depending on the successful completion of previous tasks.
This link will drive you through the simple steps to set up AWS Data Pipeline. As we know, after 2013-12-04, AWS will create a VPC for the related region when creating the AWS account. Therefore, the default configuration of the default VPC supports AWS Data Pipeline resources.
Use Case: Customers can choose to run their web server inside an EC2 instance of a VPC. This web server tracks day-to-day life data and stores it in Amazon DynamoDB managed by AWS. So that this should be a scheduled daily automated task, the pipeline will help you give some insights into the data you have stored for a certain period. Since we are dealing with large amounts of data, and they require security and performance at the highest possible level, we need DynamoDB VPC endpoints to make the setup efficient and secure. Note: AWS recommends that you create resources for all your pipelines in VPCs.
Security Considerations When using VPC endpoints with DynamoDB, it's crucial to consider security best practices. Ensure that your VPC endpoint policies are as restrictive as possible, granting only the necessary permissions to the required resources. Regularly review and update these policies to adapt to changing security requirements. Additionally, monitor the traffic through your VPC endpoints using AWS CloudWatch to detect any unusual activity or potential security threats.
Frequently Asked Questions My Lambda in VPC can't find a connection with DynamoDB - what should I do? DynamoDB is located outside the VPC, and AWS fully manages it. Therefore, to connect to DynamoDB from a Lambda function within a VPC, you need to connect it through a VPC endpoint.
Though it's not optimal, another alternative is to use a NAT Gateway if your Lambda is in a private subnet. Your Lambda is able to connect with DynamoDB. This link refers to an article that will help to set up the NAT Gateway with VPC.
Does DynamoDB require VPC? No. You can retrieve or send data to DynamoDB over the public network. By default, communications to and from DynamoDB use the HTTPS protocol, protecting network traffic using SSL/TLS encryption.
A VPC endpoint for DynamoDB enables your VPC's EC2 instances to use their private IP addresses to access DynamoDB with increased privacy, security, and greater efficiency.
Login to the AWS Console less. Use Dynobase. Try 7-day free trial. No strings attached.
Download Now