diff --git a/404.html b/404.html index ac3e619..eb9ed43 100644 --- a/404.html +++ b/404.html @@ -1,4 +1,1201 @@ - DNS 53 + + + + + +

404 - Not found

\ No newline at end of file + + + + + + + + + + + + + + + + +
+ +
+
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ +

404 - Not found

+ +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/assets/images/social/configure/auto-attachment.png b/assets/images/social/configure/auto-attachment.png index 022526e..142276a 100644 Binary files a/assets/images/social/configure/auto-attachment.png and b/assets/images/social/configure/auto-attachment.png differ diff --git a/assets/images/social/configure/broadcast-ec2.png b/assets/images/social/configure/broadcast-ec2.png index 1495a38..5623acd 100644 Binary files a/assets/images/social/configure/broadcast-ec2.png and b/assets/images/social/configure/broadcast-ec2.png differ diff --git a/assets/images/social/configure/custom-domain.png b/assets/images/social/configure/custom-domain.png index 73f7565..e6e3d9f 100644 Binary files a/assets/images/social/configure/custom-domain.png and b/assets/images/social/configure/custom-domain.png differ diff --git a/assets/images/social/configure/exposing-tags.png b/assets/images/social/configure/exposing-tags.png index d700602..e2f29b0 100644 Binary files a/assets/images/social/configure/exposing-tags.png and b/assets/images/social/configure/exposing-tags.png differ diff --git a/assets/images/social/configure/iam.png b/assets/images/social/configure/iam.png index 7eb19c4..b5b0d69 100644 Binary files a/assets/images/social/configure/iam.png and b/assets/images/social/configure/iam.png differ diff --git a/assets/images/social/configure/list-tags.png b/assets/images/social/configure/list-tags.png index 94361a3..80829e9 100644 Binary files a/assets/images/social/configure/list-tags.png and b/assets/images/social/configure/list-tags.png differ diff --git a/assets/images/social/configure/tracing-requests.png b/assets/images/social/configure/tracing-requests.png new file mode 100644 index 0000000..6980e36 Binary files /dev/null and b/assets/images/social/configure/tracing-requests.png differ diff --git a/assets/images/social/index.png b/assets/images/social/index.png index 0bf1cf0..8010fe8 100644 Binary files a/assets/images/social/index.png and b/assets/images/social/index.png differ diff --git a/assets/images/social/install/binary.png b/assets/images/social/install/binary.png index 629f63c..44c1214 100644 Binary files a/assets/images/social/install/binary.png and b/assets/images/social/install/binary.png differ diff --git a/assets/images/social/install/source.png b/assets/images/social/install/source.png index f6d0f0e..fb1821d 100644 Binary files a/assets/images/social/install/source.png and b/assets/images/social/install/source.png differ diff --git a/assets/images/social/license.png b/assets/images/social/license.png deleted file mode 100644 index 792683f..0000000 Binary files a/assets/images/social/license.png and /dev/null differ diff --git a/assets/images/social/reference/cli/dns53-imds.png b/assets/images/social/reference/cli/dns53-imds.png deleted file mode 100644 index 3124933..0000000 Binary files a/assets/images/social/reference/cli/dns53-imds.png and /dev/null differ diff --git a/assets/images/social/reference/cli/dns53-tags.png b/assets/images/social/reference/cli/dns53-tags.png deleted file mode 100644 index 920b38f..0000000 Binary files a/assets/images/social/reference/cli/dns53-tags.png and /dev/null differ diff --git a/assets/images/social/reference/cli/dns53.png b/assets/images/social/reference/cli/dns53.png deleted file mode 100644 index e014e7c..0000000 Binary files a/assets/images/social/reference/cli/dns53.png and /dev/null differ diff --git a/assets/images/social/reference/templating.png b/assets/images/social/reference/templating.png index acc54c0..c2343c8 100644 Binary files a/assets/images/social/reference/templating.png and b/assets/images/social/reference/templating.png differ diff --git a/assets/javascripts/bundle.01b2e45f.min.js b/assets/javascripts/bundle.01b2e45f.min.js deleted file mode 100644 index ced38a8..0000000 --- a/assets/javascripts/bundle.01b2e45f.min.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict";(()=>{var la=Object.create;var Mr=Object.defineProperty;var ua=Object.getOwnPropertyDescriptor;var ma=Object.getOwnPropertyNames,Ut=Object.getOwnPropertySymbols,da=Object.getPrototypeOf,Lr=Object.prototype.hasOwnProperty,un=Object.prototype.propertyIsEnumerable;var ln=(e,t,r)=>t in e?Mr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))Lr.call(t,r)&&ln(e,r,t[r]);if(Ut)for(var r of Ut(t))un.call(t,r)&&ln(e,r,t[r]);return e};var mn=(e,t)=>{var r={};for(var n in e)Lr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ut)for(var n of Ut(e))t.indexOf(n)<0&&un.call(e,n)&&(r[n]=e[n]);return r};var Ot=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ha=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ma(t))!Lr.call(e,o)&&o!==r&&Mr(e,o,{get:()=>t[o],enumerable:!(n=ua(t,o))||n.enumerable});return e};var it=(e,t,r)=>(r=e!=null?la(da(e)):{},ha(t||!e||!e.__esModule?Mr(r,"default",{value:e,enumerable:!0}):r,e));var hn=Ot((Ar,dn)=>{(function(e,t){typeof Ar=="object"&&typeof dn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Ar,function(){"use strict";function e(r){var n=!0,o=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(M){return!!(M&&M!==document&&M.nodeName!=="HTML"&&M.nodeName!=="BODY"&&"classList"in M&&"contains"in M.classList)}function c(M){var qe=M.type,Ue=M.tagName;return!!(Ue==="INPUT"&&a[qe]&&!M.readOnly||Ue==="TEXTAREA"&&!M.readOnly||M.isContentEditable)}function p(M){M.classList.contains("focus-visible")||(M.classList.add("focus-visible"),M.setAttribute("data-focus-visible-added",""))}function f(M){!M.hasAttribute("data-focus-visible-added")||(M.classList.remove("focus-visible"),M.removeAttribute("data-focus-visible-added"))}function l(M){M.metaKey||M.altKey||M.ctrlKey||(s(r.activeElement)&&p(r.activeElement),n=!0)}function m(M){n=!1}function d(M){!s(M.target)||(n||c(M.target))&&p(M.target)}function h(M){!s(M.target)||(M.target.classList.contains("focus-visible")||M.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),f(M.target))}function b(M){document.visibilityState==="hidden"&&(o&&(n=!0),$())}function $(){document.addEventListener("mousemove",V),document.addEventListener("mousedown",V),document.addEventListener("mouseup",V),document.addEventListener("pointermove",V),document.addEventListener("pointerdown",V),document.addEventListener("pointerup",V),document.addEventListener("touchmove",V),document.addEventListener("touchstart",V),document.addEventListener("touchend",V)}function X(){document.removeEventListener("mousemove",V),document.removeEventListener("mousedown",V),document.removeEventListener("mouseup",V),document.removeEventListener("pointermove",V),document.removeEventListener("pointerdown",V),document.removeEventListener("pointerup",V),document.removeEventListener("touchmove",V),document.removeEventListener("touchstart",V),document.removeEventListener("touchend",V)}function V(M){M.target.nodeName&&M.target.nodeName.toLowerCase()==="html"||(n=!1,X())}document.addEventListener("keydown",l,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",b,!0),$(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var bn=Ot(Cr=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(p){return!1}},r=t(),n=function(p){var f={next:function(){var l=p.shift();return{done:l===void 0,value:l}}};return r&&(f[Symbol.iterator]=function(){return f}),f},o=function(p){return encodeURIComponent(p).replace(/%20/g,"+")},i=function(p){return decodeURIComponent(String(p).replace(/\+/g," "))},a=function(){var p=function(l){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof l;if(m!=="undefined")if(m==="string")l!==""&&this._fromString(l);else if(l instanceof p){var d=this;l.forEach(function(X,V){d.append(V,X)})}else if(l!==null&&m==="object")if(Object.prototype.toString.call(l)==="[object Array]")for(var h=0;hd[0]?1:0}),p._entries&&(p._entries={});for(var l=0;l1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Cr);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(c,p){typeof c!="string"&&(c=String(c)),p&&typeof p!="string"&&(p=String(p));var f=document,l;if(p&&(e.location===void 0||p!==e.location.href)){p=p.toLowerCase(),f=document.implementation.createHTMLDocument(""),l=f.createElement("base"),l.href=p,f.head.appendChild(l);try{if(l.href.indexOf(p)!==0)throw new Error(l.href)}catch(M){throw new Error("URL unable to set base "+p+" due to "+M)}}var m=f.createElement("a");m.href=c,l&&(f.body.appendChild(m),m.href=m.href);var d=f.createElement("input");if(d.type="url",d.value=c,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!p)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),b=!0,$=!0,X=this;["append","delete","set"].forEach(function(M){var qe=h[M];h[M]=function(){qe.apply(h,arguments),b&&($=!1,X.search=h.toString(),$=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var V=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==V&&(V=this.search,$&&(b=!1,this.searchParams._fromString(this.search),b=!0))}})},a=i.prototype,s=function(c){Object.defineProperty(a,c,{get:function(){return this._anchorElement[c]},set:function(p){this._anchorElement[c]=p},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(c){s(c)}),Object.defineProperty(a,"search",{get:function(){return this._anchorElement.search},set:function(c){this._anchorElement.search=c,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(a,{toString:{get:function(){var c=this;return function(){return c.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(c){this._anchorElement.href=c,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(c){this._anchorElement.pathname=c},enumerable:!0},origin:{get:function(){var c={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],p=this._anchorElement.port!=c&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(p?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(c){},enumerable:!0},username:{get:function(){return""},set:function(c){},enumerable:!0}}),i.createObjectURL=function(c){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(c){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Cr)});var jn=Ot((rc,Vt)=>{var vn,gn,yn,xn,En,wn,Sn,On,Tn,Wt,kr,_n,Mn,Ln,at,An,Cn,kn,Rn,Hn,Pn,$n,In,Dt;(function(e){var t=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(n){e(r(t,r(n)))}):typeof Vt=="object"&&typeof Vt.exports=="object"?e(r(t,r(Vt.exports))):e(r(t));function r(n,o){return n!==t&&(typeof Object.create=="function"?Object.defineProperty(n,"__esModule",{value:!0}):n.__esModule=!0),function(i,a){return n[i]=o?o(i,a):a}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])};vn=function(n,o){if(typeof o!="function"&&o!==null)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");t(n,o);function i(){this.constructor=n}n.prototype=o===null?Object.create(o):(i.prototype=o.prototype,new i)},gn=Object.assign||function(n){for(var o,i=1,a=arguments.length;i=0;f--)(p=n[f])&&(c=(s<3?p(c):s>3?p(o,i,c):p(o,i))||c);return s>3&&c&&Object.defineProperty(o,i,c),c},En=function(n,o){return function(i,a){o(i,a,n)}},wn=function(n,o){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,o)},Sn=function(n,o,i,a){function s(c){return c instanceof i?c:new i(function(p){p(c)})}return new(i||(i=Promise))(function(c,p){function f(d){try{m(a.next(d))}catch(h){p(h)}}function l(d){try{m(a.throw(d))}catch(h){p(h)}}function m(d){d.done?c(d.value):s(d.value).then(f,l)}m((a=a.apply(n,o||[])).next())})},On=function(n,o){var i={label:0,sent:function(){if(c[0]&1)throw c[1];return c[1]},trys:[],ops:[]},a,s,c,p;return p={next:f(0),throw:f(1),return:f(2)},typeof Symbol=="function"&&(p[Symbol.iterator]=function(){return this}),p;function f(m){return function(d){return l([m,d])}}function l(m){if(a)throw new TypeError("Generator is already executing.");for(;i;)try{if(a=1,s&&(c=m[0]&2?s.return:m[0]?s.throw||((c=s.return)&&c.call(s),0):s.next)&&!(c=c.call(s,m[1])).done)return c;switch(s=0,c&&(m=[m[0]&2,c.value]),m[0]){case 0:case 1:c=m;break;case 4:return i.label++,{value:m[1],done:!1};case 5:i.label++,s=m[1],m=[0];continue;case 7:m=i.ops.pop(),i.trys.pop();continue;default:if(c=i.trys,!(c=c.length>0&&c[c.length-1])&&(m[0]===6||m[0]===2)){i=0;continue}if(m[0]===3&&(!c||m[1]>c[0]&&m[1]=n.length&&(n=void 0),{value:n&&n[a++],done:!n}}};throw new TypeError(o?"Object is not iterable.":"Symbol.iterator is not defined.")},kr=function(n,o){var i=typeof Symbol=="function"&&n[Symbol.iterator];if(!i)return n;var a=i.call(n),s,c=[],p;try{for(;(o===void 0||o-- >0)&&!(s=a.next()).done;)c.push(s.value)}catch(f){p={error:f}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(p)throw p.error}}return c},_n=function(){for(var n=[],o=0;o1||f(b,$)})})}function f(b,$){try{l(a[b]($))}catch(X){h(c[0][3],X)}}function l(b){b.value instanceof at?Promise.resolve(b.value.v).then(m,d):h(c[0][2],b)}function m(b){f("next",b)}function d(b){f("throw",b)}function h(b,$){b($),c.shift(),c.length&&f(c[0][0],c[0][1])}},Cn=function(n){var o,i;return o={},a("next"),a("throw",function(s){throw s}),a("return"),o[Symbol.iterator]=function(){return this},o;function a(s,c){o[s]=n[s]?function(p){return(i=!i)?{value:at(n[s](p)),done:s==="return"}:c?c(p):p}:c}},kn=function(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var o=n[Symbol.asyncIterator],i;return o?o.call(n):(n=typeof Wt=="function"?Wt(n):n[Symbol.iterator](),i={},a("next"),a("throw"),a("return"),i[Symbol.asyncIterator]=function(){return this},i);function a(c){i[c]=n[c]&&function(p){return new Promise(function(f,l){p=n[c](p),s(f,l,p.done,p.value)})}}function s(c,p,f,l){Promise.resolve(l).then(function(m){c({value:m,done:f})},p)}},Rn=function(n,o){return Object.defineProperty?Object.defineProperty(n,"raw",{value:o}):n.raw=o,n};var r=Object.create?function(n,o){Object.defineProperty(n,"default",{enumerable:!0,value:o})}:function(n,o){n.default=o};Hn=function(n){if(n&&n.__esModule)return n;var o={};if(n!=null)for(var i in n)i!=="default"&&Object.prototype.hasOwnProperty.call(n,i)&&Dt(o,n,i);return r(o,n),o},Pn=function(n){return n&&n.__esModule?n:{default:n}},$n=function(n,o,i,a){if(i==="a"&&!a)throw new TypeError("Private accessor was defined without a getter");if(typeof o=="function"?n!==o||!a:!o.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?a:i==="a"?a.call(n):a?a.value:o.get(n)},In=function(n,o,i,a,s){if(a==="m")throw new TypeError("Private method is not writable");if(a==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof o=="function"?n!==o||!s:!o.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return a==="a"?s.call(n,i):s?s.value=i:o.set(n,i),i},e("__extends",vn),e("__assign",gn),e("__rest",yn),e("__decorate",xn),e("__param",En),e("__metadata",wn),e("__awaiter",Sn),e("__generator",On),e("__exportStar",Tn),e("__createBinding",Dt),e("__values",Wt),e("__read",kr),e("__spread",_n),e("__spreadArrays",Mn),e("__spreadArray",Ln),e("__await",at),e("__asyncGenerator",An),e("__asyncDelegator",Cn),e("__asyncValues",kn),e("__makeTemplateObject",Rn),e("__importStar",Hn),e("__importDefault",Pn),e("__classPrivateFieldGet",$n),e("__classPrivateFieldSet",In)})});var rn=Ot((It,tn)=>{(function(t,r){typeof It=="object"&&typeof tn=="object"?tn.exports=r():typeof define=="function"&&define.amd?define([],r):typeof It=="object"?It.ClipboardJS=r():t.ClipboardJS=r()})(It,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return fa}});var a=i(279),s=i.n(a),c=i(370),p=i.n(c),f=i(817),l=i.n(f);function m(F){try{return document.execCommand(F)}catch(L){return!1}}var d=function(L){var _=l()(L);return m("cut"),_},h=d;function b(F){var L=document.documentElement.getAttribute("dir")==="rtl",_=document.createElement("textarea");_.style.fontSize="12pt",_.style.border="0",_.style.padding="0",_.style.margin="0",_.style.position="absolute",_.style[L?"right":"left"]="-9999px";var I=window.pageYOffset||document.documentElement.scrollTop;return _.style.top="".concat(I,"px"),_.setAttribute("readonly",""),_.value=F,_}var $=function(L,_){var I=b(L);_.container.appendChild(I);var j=l()(I);return m("copy"),I.remove(),j},X=function(L){var _=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},I="";return typeof L=="string"?I=$(L,_):L instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(L==null?void 0:L.type)?I=$(L.value,_):(I=l()(L),m("copy")),I},V=X;function M(F){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?M=function(_){return typeof _}:M=function(_){return _&&typeof Symbol=="function"&&_.constructor===Symbol&&_!==Symbol.prototype?"symbol":typeof _},M(F)}var qe=function(){var L=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},_=L.action,I=_===void 0?"copy":_,j=L.container,Q=L.target,Ae=L.text;if(I!=="copy"&&I!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Q!==void 0)if(Q&&M(Q)==="object"&&Q.nodeType===1){if(I==="copy"&&Q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(I==="cut"&&(Q.hasAttribute("readonly")||Q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Ae)return V(Ae,{container:j});if(Q)return I==="cut"?h(Q):V(Q,{container:j})},Ue=qe;function Pe(F){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Pe=function(_){return typeof _}:Pe=function(_){return _&&typeof Symbol=="function"&&_.constructor===Symbol&&_!==Symbol.prototype?"symbol":typeof _},Pe(F)}function ra(F,L){if(!(F instanceof L))throw new TypeError("Cannot call a class as a function")}function fn(F,L){for(var _=0;_0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof j.action=="function"?j.action:this.defaultAction,this.target=typeof j.target=="function"?j.target:this.defaultTarget,this.text=typeof j.text=="function"?j.text:this.defaultText,this.container=Pe(j.container)==="object"?j.container:document.body}},{key:"listenClick",value:function(j){var Q=this;this.listener=p()(j,"click",function(Ae){return Q.onClick(Ae)})}},{key:"onClick",value:function(j){var Q=j.delegateTarget||j.currentTarget,Ae=this.action(Q)||"copy",Ft=Ue({action:Ae,container:this.container,target:this.target(Q),text:this.text(Q)});this.emit(Ft?"success":"error",{action:Ae,text:Ft,trigger:Q,clearSelection:function(){Q&&Q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(j){return _r("action",j)}},{key:"defaultTarget",value:function(j){var Q=_r("target",j);if(Q)return document.querySelector(Q)}},{key:"defaultText",value:function(j){return _r("text",j)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(j){var Q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return V(j,Q)}},{key:"cut",value:function(j){return h(j)}},{key:"isSupported",value:function(){var j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Q=typeof j=="string"?[j]:j,Ae=!!document.queryCommandSupported;return Q.forEach(function(Ft){Ae=Ae&&!!document.queryCommandSupported(Ft)}),Ae}}]),_}(s()),fa=pa},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,c){for(;s&&s.nodeType!==o;){if(typeof s.matches=="function"&&s.matches(c))return s;s=s.parentNode}}n.exports=a},438:function(n,o,i){var a=i(828);function s(f,l,m,d,h){var b=p.apply(this,arguments);return f.addEventListener(m,b,h),{destroy:function(){f.removeEventListener(m,b,h)}}}function c(f,l,m,d,h){return typeof f.addEventListener=="function"?s.apply(null,arguments):typeof m=="function"?s.bind(null,document).apply(null,arguments):(typeof f=="string"&&(f=document.querySelectorAll(f)),Array.prototype.map.call(f,function(b){return s(b,l,m,d,h)}))}function p(f,l,m,d){return function(h){h.delegateTarget=a(h.target,l),h.delegateTarget&&d.call(f,h)}}n.exports=c},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(n,o,i){var a=i(879),s=i(438);function c(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(h))throw new TypeError("Third argument must be a Function");if(a.node(m))return p(m,d,h);if(a.nodeList(m))return f(m,d,h);if(a.string(m))return l(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function f(m,d,h){return Array.prototype.forEach.call(m,function(b){b.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(b){b.removeEventListener(d,h)})}}}function l(m,d,h){return s(document.body,m,d,h)}n.exports=c},817:function(n){function o(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),a=c.toString()}return a}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,a,s){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var c=this;function p(){c.off(i,p),a.apply(s,arguments)}return p._=a,this.on(i,p,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=s.length;for(c;c{"use strict";var Is=/["'&<>]/;Mi.exports=js;function js(e){var t=""+e,r=Is.exec(t);if(!r)return t;var n,o="",i=0,a=0;for(i=r.index;i{function e(o,i){parent.postMessage(o,i||"*")}function t(...o){return o.reduce((i,a)=>i.then(()=>new Promise(s=>{let c=document.createElement("script");c.src=a,c.addEventListener("load",()=>s()),document.body.appendChild(c)})),Promise.resolve())}function r(){let o=document.createElement("iframe");return o.width=o.height=o.frameBorder="0",o}var n=class{constructor(o,i){if(this.url=o,this.onerror=null,this.onmessage=null,this.onmessageerror=null,this.handleMessage=s=>{s.source===this.worker&&(s.stopImmediatePropagation(),this.dispatchEvent(new MessageEvent("message",{data:s.data})),this.onmessage&&this.onmessage(s))},this.handleError=(s,c,p,f,l)=>{if(c===this.url.toString()){let m=new ErrorEvent("error",{message:s,filename:c,lineno:p,colno:f,error:l});this.dispatchEvent(m),this.onerror&&this.onerror(m)}},typeof i!="undefined")throw new TypeError("Options are not supported for iframe workers");let a=new EventTarget;this.addEventListener=a.addEventListener.bind(a),this.removeEventListener=a.removeEventListener.bind(a),this.dispatchEvent=a.dispatchEvent.bind(a),document.body.appendChild(this.iframe=r()),this.worker.document.open(),this.worker.document.write(` + + + + + +

Auto Attachment of your EC2

Your EC2 can automatically be attached to a default Route53 Private Hosted Zone (PHZ) called dns53.

dns53 --auto-attach
-

For this to work as intended, dns53 handles two attachment scenarios, removing the need for any PHZ management. 👍

recorded using VHS 💜

You are the first Auto Attachment

Congratulations, you beat everyone else in your team or organisation and auto-attached your EC2 to the default dns53 PHZ. dns53 will:

  1. Create the new dns53 PHZ and associate the launched EC2 VPC with it.
  2. Broadcasts your EC2 as expected, using a custom domain name if provided.
  3. Tidies everything up when you exit.

Auto Attachment has already happened

If someone in your team, or organisation, was super keen and already auto-attached their EC2 to the default dns53 PHZ, your attachment will be slightly different. dns53 will:

  1. Check if your launched EC2 is within a VPC associated with the PHZ. If not, it will create a new association.
  2. Broadcasts your EC2 as expected, using a custom domain name if provided.
  3. Tidies everything up when you exit.

A 10,000-foot view

Auto Attachment Flow

\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+ +
+ + + + + + + +

Auto Attachment of your EC2

+

Your EC2 can automatically be attached to a default Route53 Private Hosted Zone (PHZ) called dns53.

+
dns53 --auto-attach
+
+

For this to work as intended, dns53 handles two attachment scenarios, removing the need for any PHZ management. 👍

+
+ +
+ +

You are the first Auto Attachment

+

Congratulations, you beat everyone else in your team or organisation and auto-attached your EC2 to the default dns53 PHZ. dns53 will:

+
    +
  1. Create the new dns53 PHZ and associate the launched EC2 VPC with it.
  2. +
  3. Broadcasts your EC2 as expected, using a custom domain name if provided.
  4. +
  5. Tidies everything up when you exit.
  6. +
+

Auto Attachment has already happened

+

If someone in your team, or organisation, was super keen and already auto-attached their EC2 to the default dns53 PHZ, your attachment will be slightly different. dns53 will:

+
    +
  1. Check if your launched EC2 is within a VPC associated with the PHZ. If not, it will create a new association.
  2. +
  3. Broadcasts your EC2 as expected, using a custom domain name if provided.
  4. +
  5. Tidies everything up when you exit.
  6. +
+

A 10,000-foot view

+

Auto Attachment Flow

+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/configure/broadcast-ec2/index.html b/configure/broadcast-ec2/index.html index 82a5b06..4bfd899 100644 --- a/configure/broadcast-ec2/index.html +++ b/configure/broadcast-ec2/index.html @@ -1,6 +1,1371 @@ - Broadcast your EC2 - DNS 53 + + + + + +

Privately Broadcast your EC2

To broadcast your EC2 privately within your VPC couldn't be easier. Launch the wizard and follow the on-screen prompts:

dns53
-

Default Domain Name

A default domain name will be assigned to your EC2 when dns53 adds an A-Record to the chosen Route53 Private Hosted Zone (PHZ).

It follows the format:

<EC2_PRIVATE_IPv4>.dns53.<PHZ_ROOT_DOMAIN> ~> 10-0-1-182.dns53.testing

Skipping the Wizard

If you have the ID of your Route53 PHZ handy, you can skip the wizard and immediately broadcast your EC2:

dns53 --phz-id Z05504861FO8RFR02KU72
-
recorded using VHS 💜
\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

Privately Broadcast your EC2

+

To broadcast your EC2 privately within your VPC couldn't be easier. Launch the wizard and follow the on-screen prompts:

+
dns53
+
+

Default Domain Name

+

A default domain name will be assigned to your EC2 when dns53 adds an A-Record to the chosen Route53 Private Hosted Zone (PHZ).

+

It follows the format:

+

<EC2_PRIVATE_IPv4>.dns53.<PHZ_ROOT_DOMAIN> ~> 10-0-1-182.dns53.testing

+

Skipping the Wizard

+

If you have the ID of your Route53 PHZ handy, you can skip the wizard and immediately broadcast your EC2:

+
dns53 --phz-id Z05504861FO8RFR02KU72
+
+
+ +
+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/configure/custom-domain/index.html b/configure/custom-domain/index.html index 6ef4930..1191fe2 100644 --- a/configure/custom-domain/index.html +++ b/configure/custom-domain/index.html @@ -1,6 +1,1402 @@ - Custom Domain - DNS 53 + + + + + +

Using a Custom Domain Name

If you want complete control of the domain name associated with your EC2, you can customise it in one of two ways.

Route53 Root Domain is Optional

dns53 will automatically append the Route53 root domain when creating the A-Record. Feel free to omit this when providing a custom domain

Static Domain

dns53 --domain-name "my.ec2"
-

Templated Domain

A templated domain leverages the text templating capabilities of the Go language to replace named fields with concrete values. A list of supported named fields can be found here.

dns53 --domain-name "{{.IPv4}}.{{.Region}}"
-

Domain Validation

A custom domain must be valid before assigning it to your EC2 instance. A series of checks must pass.

A domain must:

  • not contain leading or trailing hyphens (-) and dots (.)
  • not contain consecutive hyphens (--) or dots (..)
  • not contain whitespace ()
  • only contain valid characters from the sequence [A-Za-z0-9-.]

dns53 will automatically clean any domain name in an attempt to enforce these validation checks.

\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

Using a Custom Domain Name

+

If you want complete control of the domain name associated with your EC2, you can customise it in one of two ways.

+
+

Route53 Root Domain is Optional

+

dns53 will automatically append the Route53 root domain when creating the A-Record. Feel free to omit this when providing a custom domain

+
+

Static Domain

+
dns53 --domain-name "my.ec2"
+
+

Templated Domain

+

A templated domain leverages the text templating capabilities of the Go language to replace named fields with concrete values. A list of supported named fields can be found here.

+
dns53 --domain-name "{{.IPv4}}.{{.Region}}"
+
+

Domain Validation

+

A custom domain must be valid before assigning it to your EC2 instance. A series of checks must pass.

+

A domain must:

+
    +
  • not contain leading or trailing hyphens (-) and dots (.)
  • +
  • not contain consecutive hyphens (--) or dots (..)
  • +
  • not contain whitespace ()
  • +
  • only contain valid characters from the sequence [A-Za-z0-9-.]
  • +
+

dns53 will automatically clean any domain name in an attempt to enforce these validation checks.

+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/configure/exposing-tags/index.html b/configure/exposing-tags/index.html index 4d3be8e..fc28025 100644 --- a/configure/exposing-tags/index.html +++ b/configure/exposing-tags/index.html @@ -1,5 +1,1341 @@ - Expose EC2 Tags - DNS 53 + + + + + +

Exposing EC2 Instance Tags

By default, EC2 tags are not accessible through the Instance Metadata Service (IMDS) and subsequently by dns53. Granting access to EC2 instance tags can be carried out manually1 or with the following custom command:

dns53 imds --instance-metadata-tags on
-

Cleaning Tag Names

All tags accessible through IMDS will subsequently be "cleaned" and made available for crafting custom domain names. A Pascal Case naming convention is applied to all tags when stored within an internal map alongside their originally named counterpart, and both are accessible through templating.


  1. Access to EC2 instance tags can be granted directly through the AWS Console or by using the CLI as documented here 

\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

Exposing EC2 Instance Tags

+

By default, EC2 tags are not accessible through the Instance Metadata Service (IMDS) and subsequently by dns53. Granting access to EC2 instance tags can be carried out manually1 or with the following custom command:

+
dns53 imds --instance-metadata-tags on
+
+

Cleaning Tag Names

+

All tags accessible through IMDS will subsequently be "cleaned" and made available for crafting custom domain names. A Pascal Case naming convention is applied to all tags when stored within an internal map alongside their originally named counterpart, and both are accessible through templating.

+
+
+
    +
  1. +

    Access to EC2 instance tags can be granted directly through the AWS Console or by using the CLI as documented here 

    +
  2. +
+
+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/configure/iam/index.html b/configure/iam/index.html index 5d1ee9c..5e22837 100644 --- a/configure/iam/index.html +++ b/configure/iam/index.html @@ -1,35 +1,1296 @@ - IAM - DNS 53 + + + + + +

IAM Permissions

Access to Route53 and EC2 is required for dns53 to work. Your IAM persona must have the following permissions granted:

{
-  "Version": "2012-10-17",
-  "Statement": [
-    {
-      "Effect": "Allow",
-      "Action": [
-        "route53:AssociateVPCWithHostedZone",
-        "route53:ChangeResourceRecordSets",
-        "route53:DeleteHostedZone",
-        "route53:DisassociateVPCFromHostedZone",
-        "route53:GetHostedZone"
-      ],
-      "Resource": "arn:aws:route53:::hostedzone/*"
-    },
-    {
-      "Effect": "Allow",
-      "Action": [
-        "ec2:DescribeVpcs",
-        "route53:CreateHostedZone",
-        "route53:ListHostedZonesByName",
-        "route53:ListHostedZonesByVPC"
-      ],
-      "Resource": "*"
-    },
-    {
-      "Effect": "Allow",
-      "Action": ["ec2:ModifyInstanceMetadataOptions"],
-      "Resource": "arn:aws:ec2:<REGION>:<ACCOUNT>:instance/*" // (1)!
-    }
-  ]
-}
-
  1. Don't forget to replace the <REGION> and <ACCOUNT> placeholders with your specific AWS details, e.g. arn:aws:ec2:eu-west-2:112233445566:instance/*. You could also lock it down to a specific EC2 instance if you wanted 🔒

Aim for Least Privilege 🔒

It would be best if you fine-tuned this policy further to restrict access and adopt the mantra of "least privilege". You accept this policy at your own risk

\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

IAM Permissions

+

Access to Route53 and EC2 is required for dns53 to work. Your IAM persona must have the following permissions granted:

+
{
+  "Version": "2012-10-17",
+  "Statement": [
+    {
+      "Effect": "Allow",
+      "Action": [
+        "route53:AssociateVPCWithHostedZone",
+        "route53:ChangeResourceRecordSets",
+        "route53:DeleteHostedZone",
+        "route53:DisassociateVPCFromHostedZone",
+        "route53:GetHostedZone"
+      ],
+      "Resource": "arn:aws:route53:::hostedzone/*"
+    },
+    {
+      "Effect": "Allow",
+      "Action": [
+        "ec2:DescribeVpcs",
+        "route53:CreateHostedZone",
+        "route53:ListHostedZonesByName",
+        "route53:ListHostedZonesByVPC"
+      ],
+      "Resource": "*"
+    },
+    {
+      "Effect": "Allow",
+      "Action": ["ec2:ModifyInstanceMetadataOptions"],
+      "Resource": "arn:aws:ec2:<REGION>:<ACCOUNT>:instance/*" // (1)!
+    }
+  ]
+}
+
+
    +
  1. Don't forget to replace the <REGION> and <ACCOUNT> placeholders with your specific AWS details, e.g. arn:aws:ec2:eu-west-2:112233445566:instance/*. You could also lock it down to a specific EC2 instance if you wanted 🔒
  2. +
+
+

Aim for Least Privilege 🔒

+

It would be best if you fine-tuned this policy further to restrict access and adopt the mantra of "least privilege". You accept this policy at your own risk

+
+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/configure/list-tags/index.html b/configure/list-tags/index.html index 620d307..ee83321 100644 --- a/configure/list-tags/index.html +++ b/configure/list-tags/index.html @@ -1,5 +1,1259 @@ - List EC2 Tags - DNS 53 + + + + + +

List Available EC2 Instance Tags

To generate a cheat sheet for including EC2 instance tags within a custom domain using Go templating, run the following command:

dns tags
-
\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

List Available EC2 Instance Tags

+

To generate a cheat sheet for including EC2 instance tags within a custom domain using Go templating, run the following command:

+
dns tags
+
+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/configure/tracing-requests/index.html b/configure/tracing-requests/index.html new file mode 100644 index 0000000..22d18e6 --- /dev/null +++ b/configure/tracing-requests/index.html @@ -0,0 +1,1353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tracing Requests - DNS 53 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

Tracing Requests with a Reverse Proxy

+

To trace requests sent to your broadcasted EC2, dns53 comes bundled with an internal reverse proxy. To enable proxying:

+
dns53 --proxy
+
+

Once enabled, set the required environment variables to trace both HTTP and HTTPS requests. It is advised not to proxy any requests to IMDS on your EC2.

+
export HTTP_PROXY=http://localhost:10080
+export HTTPS_PROXY=http://localhost:10080
+export NO_PROXY=169.254.169.254
+
+
curl http://httpbin.org/headers
+
+
curl https://httpbin.org/ip -k
+
+

If you do not wish to set any of these environment variables, your preferred CLI tool should support request proxying using a dedicated flag. For curl, that is -x.

+

Changing the proxy port

+

Feel free to change the default proxy port of :10080 by using the proxy-port flag:

+
dns53 --proxy --proxy-port 10888
+
+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/css/timeago.css b/css/timeago.css deleted file mode 100644 index f7ab7d6..0000000 --- a/css/timeago.css +++ /dev/null @@ -1,15 +0,0 @@ -/* - timeago output is dynamic, which breaks when you print a page. - - This CSS is only included when type: timeago - and ensures fallback to type "iso_date" when printing. - - */ - -.git-revision-date-localized-plugin-iso_date { display: none } - -@media print { - .git-revision-date-localized-plugin-iso_date { display: inline } - .git-revision-date-localized-plugin-timeago { display: none } -} - diff --git a/index.html b/index.html index 2d7e0f2..39c89fe 100644 --- a/index.html +++ b/index.html @@ -1,4 +1,1257 @@ - DNS 53 + + + + + +

dns53

Dynamic DNS within Amazon Route 53. Expose your EC2 quickly, easily, and privately within a Route 53 Private Hosted Zone (PHZ).

Easily collaborate with a colleague by exposing your EC2 within a team VPC. You could even hook up a locally running application to a local k3d cluster using an ExternalName service during development. Once your EC2 is exposed, control how it is accessed through your EC2 security groups.

Written in Go, dns53 is incredibly small and easy to install.

recorded using VHS 💜
\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

DNS 53

+

Dynamic DNS within Amazon Route 53. Expose your EC2 quickly, easily, and privately within a Route 53 Private Hosted Zone (PHZ).

+

Easily collaborate with a colleague by exposing your EC2 within a team VPC. You could even hook up a locally running application to a local k3d cluster using an ExternalName service during development. Once your EC2 is exposed, control how it is accessed through your EC2 security groups.

+
+ +
+ + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/install/binary/index.html b/install/binary/index.html index 784937e..9ba37ac 100644 --- a/install/binary/index.html +++ b/install/binary/index.html @@ -1,29 +1,1684 @@ - Binary - DNS 53 + + + + + +

Installing the Binary

You can use various package managers to install the dns53 binary. Take your pick.

Package Managers

Homebrew

To use Homebrew:

brew install purpleclay/tap/dns53
-

Scoop

To use Scoop:

scoop bucket add purpleclay https://github.com/purpleclay/scoop-bucket.git
-scoop install dns53
-

Apt

To install using the apt package manager:

echo 'deb [trusted=yes] https://fury.purpleclay.dev/apt/ /' | sudo tee /etc/apt/sources.list.d/purpleclay.list
-sudo apt update
-sudo apt install -y dns53
-

You may need to install the ca-certificates package if you encounter trust issues with regard to the Gemfury certificate:

sudo apt update && sudo apt install -y ca-certificates
-

Yum

To install using the yum package manager:

echo '[purpleclay]
-name=purpleclay
-baseurl=https://fury.purpleclay.dev/yum/
-enabled=1
-gpgcheck=0' | sudo tee /etc/yum.repos.d/purpleclay.repo
-sudo yum install -y dns53
-

Aur

To install from the aur using yay:

yay -S dns53-bin
-

Linux Packages

Download and manually install one of the .deb, .rpm or .apk packages from the Releases page.

sudo apt install dns53_*.deb
-
sudo yum localinstall dns53_*.rpm
-
sudo apk add --no-cache --allow-untrusted dns53_*.apk
-

Go Install

go install github.com/purpleclay/dns53@latest
-

Bash Script

To install the latest version using a bash script:

curl https://raw.githubusercontent.com/purpleclay/dns53/main/scripts/install | bash
-

Download a specific version using the -v flag. The script uses sudo by default but can be disabled through the --no-sudo flag.

curl https://raw.githubusercontent.com/purpleclay/dns53/main/scripts/install | bash -s -- -v v0.1.0 --no-sudo
-

Manual Download of Binary

Head over to the Releases page on GitHub and download any release artefact. Unpack the dns53 binary and add it to your PATH.

Verifying a Binary with Cosign

All binaries can be verified using cosign.

  1. Download the checksum files that need to be verified:
curl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt -O
-curl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt.sig -O
-curl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt.pem -O
-
  1. Verify the signature of the checksum file:
cosign verify-blob --cert checksums.txt.pem --signature checksums.txt.sig checksums.txt
-
  1. Download any release artefact and verify its SHA256 signature matches the entry within the checksum file:
sha256sum --ignore-missing -c checksums.txt
-
\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+ +
+ + + + + + + +

Installing the Binary

+

You can use various package managers to install the dns53 binary. Take your pick.

+

Package Managers

+

Homebrew

+

To use Homebrew:

+
brew install purpleclay/tap/dns53
+
+

Scoop

+

To use Scoop:

+
scoop bucket add purpleclay https://github.com/purpleclay/scoop-bucket.git
+scoop install dns53
+
+

Apt

+

To install using the apt package manager:

+
echo 'deb [trusted=yes] https://fury.purpleclay.dev/apt/ /' | sudo tee /etc/apt/sources.list.d/purpleclay.list
+sudo apt update
+sudo apt install -y dns53
+
+

You may need to install the ca-certificates package if you encounter trust issues with regard to the Gemfury certificate:

+
sudo apt update && sudo apt install -y ca-certificates
+
+

Yum

+

To install using the yum package manager:

+
echo '[purpleclay]
+name=purpleclay
+baseurl=https://fury.purpleclay.dev/yum/
+enabled=1
+gpgcheck=0' | sudo tee /etc/yum.repos.d/purpleclay.repo
+sudo yum install -y dns53
+
+

Aur

+

To install from the aur using yay:

+
yay -S dns53-bin
+
+

Linux Packages

+

Download and manually install one of the .deb, .rpm or .apk packages from the Releases page.

+
+
+
+
sudo apt install dns53_*.deb
+
+
+
+
sudo yum localinstall dns53_*.rpm
+
+
+
+
sudo apk add --no-cache --allow-untrusted dns53_*.apk
+
+
+
+
+

Go Install

+
go install github.com/purpleclay/dns53@latest
+
+

Bash Script

+

To install the latest version using a bash script:

+
curl https://raw.githubusercontent.com/purpleclay/dns53/main/scripts/install | bash
+
+

Download a specific version using the -v flag. The script uses sudo by default but can be disabled through the --no-sudo flag.

+
curl https://raw.githubusercontent.com/purpleclay/dns53/main/scripts/install | bash -s -- -v v0.1.0 --no-sudo
+
+

Manual Download of Binary

+

Head over to the Releases page on GitHub and download any release artefact. Unpack the dns53 binary and add it to your PATH.

+

Verifying a Binary with Cosign

+

All binaries can be verified using cosign.

+
    +
  1. Download the checksum files that need to be verified:
  2. +
+
curl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt -O
+curl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt.sig -O
+curl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt.pem -O
+
+
    +
  1. Verify the signature of the checksum file:
  2. +
+
cosign verify-blob --cert checksums.txt.pem --signature checksums.txt.sig checksums.txt
+
+
    +
  1. Download any release artefact and verify its SHA256 signature matches the entry within the checksum file:
  2. +
+
sha256sum --ignore-missing -c checksums.txt
+
+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/install/source/index.html b/install/source/index.html index 8ccec9b..afc69d3 100644 --- a/install/source/index.html +++ b/install/source/index.html @@ -1,8 +1,1268 @@ - From Source - DNS 53 + + + + + +

Compiling from Source

Download both Go 1.19+ and go-task. Then clone the code from GitHub:

git clone https://github.com/purpleclay/dns53.git
-cd dns53
-

Build:

task
-

And check that everything works:

./dns53 version
-
\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

Compiling from Source

+

Download both Go 1.21+ and go-task. Then clone the code from GitHub:

+
git clone https://github.com/purpleclay/dns53.git
+cd dns53
+
+

Build:

+
task
+
+

And check that everything works:

+
./dns53 version
+
+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/js/timeago.min.js b/js/timeago.min.js deleted file mode 100644 index a8530a5..0000000 --- a/js/timeago.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Taken from https://cdnjs.cloudflare.com/ajax/libs/timeago.js/4.0.2/timeago.min.js */ -!function(s,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((s=s||self).timeago={})}(this,function(s){"use strict";var a=["second","minute","hour","day","week","month","year"];function n(s,n){if(0===n)return["just now","right now"];var e=a[Math.floor(n/2)];return 1=m[t]&&t=m[e]&&e 0) { - var locale = nodes[0].getAttribute('locale'); - timeago.render(nodes, locale); - } - }) -} else { - var nodes = document.querySelectorAll('.timeago'); - if (nodes.length > 0) { - var locale = nodes[0].getAttribute('locale'); - timeago.render(nodes, locale); - } -} diff --git a/license/index.html b/license/index.html index ca2a317..e0a003d 100644 --- a/license/index.html +++ b/license/index.html @@ -1,4 +1,1254 @@ - License - DNS 53 + + + + + +

License

MIT License

Copyright (c) 2022 Purple Clay

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

\ No newline at end of file + + + + + + + + + + + + + + + + +
+ +
+
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

License

+ +

MIT License

+

Copyright (c) 2022 - 2023 Purple Clay

+

Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:

+

The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/overrides/main.html b/overrides/main.html index 0898567..fede74c 100644 --- a/overrides/main.html +++ b/overrides/main.html @@ -5,4 +5,21 @@ !function (t, e) { var o, n, p, r; e.__SV || (window.posthog = e, e._i = [], e.init = function (i, s, a) { function g(t, e) { var o = e.split("."); 2 == o.length && (t = t[o[0]], e = o[1]), t[e] = function () { t.push([e].concat(Array.prototype.slice.call(arguments, 0))) } } (p = t.createElement("script")).type = "text/javascript", p.async = !0, p.src = s.api_host + "/static/array.js", (r = t.getElementsByTagName("script")[0]).parentNode.insertBefore(p, r); var u = e; for (void 0 !== a ? u = e[a] = [] : a = "posthog", u.people = u.people || [], u.toString = function (t) { var e = "posthog"; return "posthog" !== a && (e += "." + a), t || (e += " (stub)"), e }, u.people.toString = function () { return u.toString(1) + ".people (stub)" }, o = "capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags".split(" "), n = 0; n < o.length; n++)g(u, o[n]); e._i.push([i, s, a]) }, e.__SV = 1) }(document, window.posthog || []); posthog.init('phc_Ncp9ZlYYmwQtHRU1t2qwW1JeIduVO1wmWEYiG25oSfN', { api_host: 'https://app.posthog.com' }) -{% endblock %} \ No newline at end of file +{% endblock %} + +{% block announce %} +For updates follow @purpleclaydev on + + + Twitter + +and + + + {% include ".icons/fontawesome/brands/mastodon.svg" %} + + Fosstodon + +{% endblock %} diff --git a/reference/cli/dns53-imds/index.html b/reference/cli/dns53-imds/index.html index 00dd421..0599838 100644 --- a/reference/cli/dns53-imds/index.html +++ b/reference/cli/dns53-imds/index.html @@ -1,9 +1,1382 @@ - dns53 imds - DNS 53 + + + + + +

Command Line

Toggle EC2 IMDS features

Usage

dns53 imds [flags]
-

Flags

-h, --help                            help for imds
-    --instance-metadata-tags string   toggle the inclusion of EC2 instance tags within IMDS (on|off)
-

Global Flags

--profile string   the AWS named profile to use when loading credentials
---region string    the AWS region to use when querying AWS
-
\ No newline at end of file + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

Command Line

+

Toggle EC2 IMDS features

+

Usage

+
dns53 imds [flags]
+
+

Flags

+
-h, --help                            help for imds
+    --instance-metadata-tags string   toggle the inclusion of EC2 instance tags
+                                      within IMDS (on|off)
+
+

Global Flags

+
--profile string   the AWS named profile to use when loading credentials
+--region string    the AWS region to use when querying AWS
+
+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/reference/cli/dns53-tags/index.html b/reference/cli/dns53-tags/index.html index 5cf0e7c..8d3ef80 100644 --- a/reference/cli/dns53-tags/index.html +++ b/reference/cli/dns53-tags/index.html @@ -1,8 +1,1378 @@ - dns53 tags - DNS 53 + + + + + +

Command Line

Lists all available EC2 instance tags and how to use them with Go templating

Usage

dns53 tags [flags]
-

Flags

-h, --help   help for tags
-

Global Flags

--profile string   the AWS named profile to use when loading credentials
---region string    the AWS region to use when querying AWS
-
\ No newline at end of file + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

Command Line

+

Lists all available EC2 instance tags and how to use them with Go templating

+

Usage

+
dns53 tags [flags]
+
+

Flags

+
-h, --help   help for tags
+
+

Global Flags

+
--profile string   the AWS named profile to use when loading credentials
+--region string    the AWS region to use when querying AWS
+
+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/reference/cli/dns53/index.html b/reference/cli/dns53/index.html index 24c2f98..1a75937 100644 --- a/reference/cli/dns53/index.html +++ b/reference/cli/dns53/index.html @@ -1,16 +1,1406 @@ - dns53 - DNS 53 + + + + + +

Command Line

Dynamic DNS within Amazon Route 53. Expose your EC2 quickly, easily, and privately within a Route 53 Private Hosted Zone (PHZ).

Your EC2 will be exposed through a dynamically generated resource record that will automatically be deleted when dns53 exits. Let dns53 name your resource record for you, or customise it to your needs.

Usage

dns53 [flags]
-dns53 [command]
-

Flags

    --auto-attach          automatically create and attach a record set to a default private hosted zone
-    --domain-name string   assign a custom domain name when generating a record set
--h, --help                 help for dns53
-    --phz-id string        an ID of a Route53 private hosted zone to use when generating a record set
-    --profile string       the AWS named profile to use when loading credentials
-    --region string        the AWS region to use when querying AWS
-

Commands

completion  Generate completion script for your target shell
-help        Help about any command
-imds        Toggle EC2 IMDS features
-version     Prints the build time version information
-
\ No newline at end of file + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

Command Line

+

Dynamic DNS within Amazon Route 53. Expose your EC2 quickly, easily, and privately within a Route 53 Private Hosted Zone (PHZ).

+

Your EC2 will be exposed through a dynamically generated resource record that will automatically be deleted when dns53 exits. Let dns53 name your resource record for you, or customise it to your needs.

+

Usage

+
dns53 [flags]
+dns53 [command]
+
+

Flags

+
    --auto-attach          automatically create and attach a record set to a
+                           default private hosted zone
+    --domain-name string   assign a custom domain name when generating a record
+                           set
+-h, --help                 help for dns53
+    --phz-id string        an ID of a Route53 private hosted zone to use when
+                           generating a record set
+    --profile string       the AWS named profile to use when loading credentials
+    --proxy                enable a reverse proxy for tracing requests to this
+                           ec2
+    --proxy-port int       the port assigned to the proxy when enabled
+                           (default 10080)
+    --region string        the AWS region to use when querying AWS
+
+

Commands

+
completion  Generate the autocompletion script for the specified shell
+help        Help about any command
+imds        Toggle EC2 IMDS features
+tags        Lists all available EC2 instance tags and how to use them with Go
+            templating
+version     Print build time version information
+
+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/reference/templating/index.html b/reference/templating/index.html index 3f20f61..8241029 100644 --- a/reference/templating/index.html +++ b/reference/templating/index.html @@ -1,4 +1,1453 @@ - Templating - DNS 53 + + + + + +

Go Templates

Full support for Go templates through a series of predefined named fields allows `dns53`` to support a dynamic configuration where needed.

Table Key

This is a living table and will change as new features are released.

  • : the metadata was formatted to ensure it is URL compliant
  • : the metadata was retrieved from EC2 instance tags; this feature must be enabled

Named Fields

The following named fields directly access metadata about your EC2 from the Instance Metadata Service (IMDS).

Named Field Description Example
{{.IPv4}} the private IPv4 address of the EC2 instance 10-0-1-182
{{.Region}} the region of the EC2 instance eu-west-2
{{.VPC}} the VPC ID of where the EC2 instance was launched vpc-016d173db537793d1
{{.AZ}} the availability zone (AZ) of the EC2 instance eu-west-2a
{{.InstanceID}} the unique ID of the EC2 instance i-03e092f544905abb2
{{.Name}} a name assigned to the EC2 instance dev-ec2

Dynamic Tags

As the IMDS service exposes all EC2 instance tags (once enabled), you can access them in much the same way as other named fields. Internally dns53 stores all tags within a Tags map and provides access to them in two ways.

  1. Directly through property chaining1, {{.Tags.Key}}
  2. Or by using the inbuilt Go templating index function, {{index .Tags "Key"}}
Named Field Description Examples
{{.Tags.Ec2Role}} the role assigned to this EC2 instance development
{{index .Tags "ec2:role"}} the role assigned to this EC2 instance development

  1. Amazon's tag naming and usage guidelines permit characters not supported by Go templating for property chaining, namely [+ - = . , _ : @]. A best efforts approach was adopted to clean the name of the tag; for further details, please read the following documentation

\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + + + +

Go Templates

+

Full support for Go templates through a series of predefined named fields allows `dns53`` to support a dynamic configuration where needed.

+
+

Table Key

+

This is a living table and will change as new features are released.

+
    +
  • : the metadata was formatted to ensure it is URL compliant
  • +
  • : the metadata was retrieved from EC2 instance tags; this feature must be enabled
  • +
+
+

Named Fields

+

The following named fields directly access metadata about your EC2 from the Instance Metadata Service (IMDS).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Named FieldDescriptionExample
{{.IPv4}}the private IPv4 address of the EC2 instance10-0-1-182
{{.Region}}the region of the EC2 instanceeu-west-2
{{.VPC}}the VPC ID of where the EC2 instance was launchedvpc-016d173db537793d1
{{.AZ}}the availability zone (AZ) of the EC2 instanceeu-west-2a
{{.InstanceID}}the unique ID of the EC2 instancei-03e092f544905abb2
{{.Name}} a name assigned to the EC2 instancedev-ec2
+

Dynamic Tags

+

As the IMDS service exposes all EC2 instance tags (once enabled), you can access them in much the same way as other named fields. Internally dns53 stores all tags within a Tags map and provides access to them in two ways.

+
    +
  1. Directly through property chaining1, {{.Tags.Key}}
  2. +
  3. Or by using the inbuilt Go templating index function, {{index .Tags "Key"}}
  4. +
+ + + + + + + + + + + + + + + + + + + + +
Named FieldDescriptionExamples
{{.Tags.Ec2Role}} the role assigned to this EC2 instancedevelopment
{{index .Tags "ec2:role"}} the role assigned to this EC2 instancedevelopment
+
+
+
    +
  1. +

    Amazon's tag naming and usage guidelines permit characters not supported by Go templating for property chaining, namely [+ - = . , _ : @]. A best efforts approach was adopted to clean the name of the tag; for further details, please read the following documentation

    +
  2. +
+
+ + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json index 3abd24c..384ed2b 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+"},"docs":[{"title":"dns53","text":"

Dynamic DNS within Amazon Route 53. Expose your EC2 quickly, easily, and privately within a Route 53 Private Hosted Zone (PHZ).

Easily collaborate with a colleague by exposing your EC2 within a team VPC. You could even hook up a locally running application to a local k3d cluster using an ExternalName service during development. Once your EC2 is exposed, control how it is accessed through your EC2 security groups.

Written in Go, dns53 is incredibly small and easy to install.

recorded using VHS \ud83d\udc9c","location":""},{"title":"License","text":"

MIT License

Copyright (c) 2022 Purple Clay

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

","location":"license/"},{"title":"Auto Attachment of your EC2","text":"

Your EC2 can automatically be attached to a default Route53 Private Hosted Zone (PHZ) called dns53.

dns53 --auto-attach\n

For this to work as intended, dns53 handles two attachment scenarios, removing the need for any PHZ management. \ud83d\udc4d

recorded using VHS \ud83d\udc9c","location":"configure/auto-attachment/"},{"title":"You are the first Auto Attachment","text":"

Congratulations, you beat everyone else in your team or organisation and auto-attached your EC2 to the default dns53 PHZ. dns53 will:

  1. Create the new dns53 PHZ and associate the launched EC2 VPC with it.
  2. Broadcasts your EC2 as expected, using a custom domain name if provided.
  3. Tidies everything up when you exit.
","location":"configure/auto-attachment/#you-are-the-first-auto-attachment"},{"title":"Auto Attachment has already happened","text":"

If someone in your team, or organisation, was super keen and already auto-attached their EC2 to the default dns53 PHZ, your attachment will be slightly different. dns53 will:

  1. Check if your launched EC2 is within a VPC associated with the PHZ. If not, it will create a new association.
  2. Broadcasts your EC2 as expected, using a custom domain name if provided.
  3. Tidies everything up when you exit.
","location":"configure/auto-attachment/#auto-attachment-has-already-happened"},{"title":"A 10,000-foot view","text":"

","location":"configure/auto-attachment/#a-10000-foot-view"},{"title":"Privately Broadcast your EC2","text":"

To broadcast your EC2 privately within your VPC couldn't be easier. Launch the wizard and follow the on-screen prompts:

dns53\n
","location":"configure/broadcast-ec2/"},{"title":"Default Domain Name","text":"

A default domain name will be assigned to your EC2 when dns53 adds an A-Record to the chosen Route53 Private Hosted Zone (PHZ).

It follows the format:

<EC2_PRIVATE_IPv4>.dns53.<PHZ_ROOT_DOMAIN> ~> 10-0-1-182.dns53.testing

","location":"configure/broadcast-ec2/#default-domain-name"},{"title":"Skipping the Wizard","text":"

If you have the ID of your Route53 PHZ handy, you can skip the wizard and immediately broadcast your EC2:

dns53 --phz-id Z05504861FO8RFR02KU72\n
recorded using VHS \ud83d\udc9c","location":"configure/broadcast-ec2/#skipping-the-wizard"},{"title":"Using a Custom Domain Name","text":"

If you want complete control of the domain name associated with your EC2, you can customise it in one of two ways.

Route53 Root Domain is Optional

dns53 will automatically append the Route53 root domain when creating the A-Record. Feel free to omit this when providing a custom domain

","location":"configure/custom-domain/"},{"title":"Static Domain","text":"
dns53 --domain-name \"my.ec2\"\n
","location":"configure/custom-domain/#static-domain"},{"title":"Templated Domain","text":"

A templated domain leverages the text templating capabilities of the Go language to replace named fields with concrete values. A list of supported named fields can be found here.

dns53 --domain-name \"{{.IPv4}}.{{.Region}}\"\n
","location":"configure/custom-domain/#templated-domain"},{"title":"Domain Validation","text":"

A custom domain must be valid before assigning it to your EC2 instance. A series of checks must pass.

A domain must:

  • not contain leading or trailing hyphens (-) and dots (.)
  • not contain consecutive hyphens (--) or dots (..)
  • not contain whitespace ()
  • only contain valid characters from the sequence [A-Za-z0-9-.]

dns53 will automatically clean any domain name in an attempt to enforce these validation checks.

","location":"configure/custom-domain/#domain-validation"},{"title":"Exposing EC2 Instance Tags","text":"

By default, EC2 tags are not accessible through the Instance Metadata Service (IMDS) and subsequently by dns53. Granting access to EC2 instance tags can be carried out manually1 or with the following custom command:

dns53 imds --instance-metadata-tags on\n
","location":"configure/exposing-tags/"},{"title":"Cleaning Tag Names","text":"

All tags accessible through IMDS will subsequently be \"cleaned\" and made available for crafting custom domain names. A Pascal Case naming convention is applied to all tags when stored within an internal map alongside their originally named counterpart, and both are accessible through templating.

  1. Access to EC2 instance tags can be granted directly through the AWS Console or by using the CLI as documented here \u21a9

","location":"configure/exposing-tags/#cleaning-tag-names"},{"title":"IAM Permissions","text":"

Access to Route53 and EC2 is required for dns53 to work. Your IAM persona must have the following permissions granted:

{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"route53:AssociateVPCWithHostedZone\",\n        \"route53:ChangeResourceRecordSets\",\n        \"route53:DeleteHostedZone\",\n        \"route53:DisassociateVPCFromHostedZone\",\n        \"route53:GetHostedZone\"\n      ],\n      \"Resource\": \"arn:aws:route53:::hostedzone/*\"\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"ec2:DescribeVpcs\",\n        \"route53:CreateHostedZone\",\n        \"route53:ListHostedZonesByName\",\n        \"route53:ListHostedZonesByVPC\"\n      ],\n      \"Resource\": \"*\"\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\"ec2:ModifyInstanceMetadataOptions\"],\n      \"Resource\": \"arn:aws:ec2:<REGION>:<ACCOUNT>:instance/*\" // (1)!\n    }\n  ]\n}\n
  1. Don't forget to replace the <REGION> and <ACCOUNT> placeholders with your specific AWS details, e.g. arn:aws:ec2:eu-west-2:112233445566:instance/*. You could also lock it down to a specific EC2 instance if you wanted

Aim for Least Privilege

It would be best if you fine-tuned this policy further to restrict access and adopt the mantra of \"least privilege\". You accept this policy at your own risk

","location":"configure/iam/"},{"title":"List Available EC2 Instance Tags","text":"

To generate a cheat sheet for including EC2 instance tags within a custom domain using Go templating, run the following command:

dns tags\n
","location":"configure/list-tags/"},{"title":"Installing the Binary","text":"

You can use various package managers to install the dns53 binary. Take your pick.

","location":"install/binary/"},{"title":"Package Managers","text":"","location":"install/binary/#package-managers"},{"title":"Homebrew","text":"

To use Homebrew:

brew install purpleclay/tap/dns53\n
","location":"install/binary/#homebrew"},{"title":"Scoop","text":"

To use Scoop:

scoop bucket add purpleclay https://github.com/purpleclay/scoop-bucket.git\nscoop install dns53\n
","location":"install/binary/#scoop"},{"title":"Apt","text":"

To install using the apt package manager:

echo 'deb [trusted=yes] https://fury.purpleclay.dev/apt/ /' | sudo tee /etc/apt/sources.list.d/purpleclay.list\nsudo apt update\nsudo apt install -y dns53\n

You may need to install the ca-certificates package if you encounter trust issues with regard to the Gemfury certificate:

sudo apt update && sudo apt install -y ca-certificates\n
","location":"install/binary/#apt"},{"title":"Yum","text":"

To install using the yum package manager:

echo '[purpleclay]\nname=purpleclay\nbaseurl=https://fury.purpleclay.dev/yum/\nenabled=1\ngpgcheck=0' | sudo tee /etc/yum.repos.d/purpleclay.repo\nsudo yum install -y dns53\n
","location":"install/binary/#yum"},{"title":"Aur","text":"

To install from the aur using yay:

yay -S dns53-bin\n
","location":"install/binary/#aur"},{"title":"Linux Packages","text":"

Download and manually install one of the .deb, .rpm or .apk packages from the Releases page.

AptYumApk
sudo apt install dns53_*.deb\n
sudo yum localinstall dns53_*.rpm\n
sudo apk add --no-cache --allow-untrusted dns53_*.apk\n
","location":"install/binary/#linux-packages"},{"title":"Go Install","text":"
go install github.com/purpleclay/dns53@latest\n
","location":"install/binary/#go-install"},{"title":"Bash Script","text":"

To install the latest version using a bash script:

curl https://raw.githubusercontent.com/purpleclay/dns53/main/scripts/install | bash\n

Download a specific version using the -v flag. The script uses sudo by default but can be disabled through the --no-sudo flag.

curl https://raw.githubusercontent.com/purpleclay/dns53/main/scripts/install | bash -s -- -v v0.1.0 --no-sudo\n
","location":"install/binary/#bash-script"},{"title":"Manual Download of Binary","text":"

Head over to the Releases page on GitHub and download any release artefact. Unpack the dns53 binary and add it to your PATH.

","location":"install/binary/#manual-download-of-binary"},{"title":"Verifying a Binary with Cosign","text":"

All binaries can be verified using cosign.

  1. Download the checksum files that need to be verified:
curl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt -O\ncurl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt.sig -O\ncurl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt.pem -O\n
  1. Verify the signature of the checksum file:
cosign verify-blob --cert checksums.txt.pem --signature checksums.txt.sig checksums.txt\n
  1. Download any release artefact and verify its SHA256 signature matches the entry within the checksum file:
sha256sum --ignore-missing -c checksums.txt\n
","location":"install/binary/#verifying-a-binary-with-cosign"},{"title":"Compiling from Source","text":"

Download both Go 1.19+ and go-task. Then clone the code from GitHub:

git clone https://github.com/purpleclay/dns53.git\ncd dns53\n

Build:

task\n

And check that everything works:

./dns53 version\n
","location":"install/source/"},{"title":"Go Templates","text":"

Full support for Go templates through a series of predefined named fields allows `dns53`` to support a dynamic configuration where needed.

Table Key

This is a living table and will change as new features are released.

  • : the metadata was formatted to ensure it is URL compliant
  • : the metadata was retrieved from EC2 instance tags; this feature must be enabled
","location":"reference/templating/"},{"title":"Named Fields","text":"

The following named fields directly access metadata about your EC2 from the Instance Metadata Service (IMDS).

Named Field Description Example {{.IPv4}} the private IPv4 address of the EC2 instance 10-0-1-182 {{.Region}} the region of the EC2 instance eu-west-2 {{.VPC}} the VPC ID of where the EC2 instance was launched vpc-016d173db537793d1 {{.AZ}} the availability zone (AZ) of the EC2 instance eu-west-2a {{.InstanceID}} the unique ID of the EC2 instance i-03e092f544905abb2 {{.Name}} a name assigned to the EC2 instance dev-ec2","location":"reference/templating/#named-fields"},{"title":"Dynamic Tags","text":"

As the IMDS service exposes all EC2 instance tags (once enabled), you can access them in much the same way as other named fields. Internally dns53 stores all tags within a Tags map and provides access to them in two ways.

  1. Directly through property chaining1, {{.Tags.Key}}
  2. Or by using the inbuilt Go templating index function, {{index .Tags \"Key\"}}
Named Field Description Examples {{.Tags.Ec2Role}} the role assigned to this EC2 instance development {{index .Tags \"ec2:role\"}} the role assigned to this EC2 instance development
  1. Amazon's tag naming and usage guidelines permit characters not supported by Go templating for property chaining, namely [+ - = . , _ : @]. A best efforts approach was adopted to clean the name of the tag; for further details, please read the following documentation.\u00a0\u21a9

","location":"reference/templating/#dynamic-tags"},{"title":"Command Line","text":"

Toggle EC2 IMDS features

","location":"reference/cli/dns53-imds/"},{"title":"Usage","text":"
dns53 imds [flags]\n
","location":"reference/cli/dns53-imds/#usage"},{"title":"Flags","text":"
-h, --help                            help for imds\n    --instance-metadata-tags string   toggle the inclusion of EC2 instance tags within IMDS (on|off)\n
","location":"reference/cli/dns53-imds/#flags"},{"title":"Global Flags","text":"
--profile string   the AWS named profile to use when loading credentials\n--region string    the AWS region to use when querying AWS\n
","location":"reference/cli/dns53-imds/#global-flags"},{"title":"Command Line","text":"

Lists all available EC2 instance tags and how to use them with Go templating

","location":"reference/cli/dns53-tags/"},{"title":"Usage","text":"
dns53 tags [flags]\n
","location":"reference/cli/dns53-tags/#usage"},{"title":"Flags","text":"
-h, --help   help for tags\n
","location":"reference/cli/dns53-tags/#flags"},{"title":"Global Flags","text":"
--profile string   the AWS named profile to use when loading credentials\n--region string    the AWS region to use when querying AWS\n
","location":"reference/cli/dns53-tags/#global-flags"},{"title":"Command Line","text":"

Dynamic DNS within Amazon Route 53. Expose your EC2 quickly, easily, and privately within a Route 53 Private Hosted Zone (PHZ).

Your EC2 will be exposed through a dynamically generated resource record that will automatically be deleted when dns53 exits. Let dns53 name your resource record for you, or customise it to your needs.

","location":"reference/cli/dns53/"},{"title":"Usage","text":"
dns53 [flags]\ndns53 [command]\n
","location":"reference/cli/dns53/#usage"},{"title":"Flags","text":"
    --auto-attach          automatically create and attach a record set to a default private hosted zone\n    --domain-name string   assign a custom domain name when generating a record set\n-h, --help                 help for dns53\n    --phz-id string        an ID of a Route53 private hosted zone to use when generating a record set\n    --profile string       the AWS named profile to use when loading credentials\n    --region string        the AWS region to use when querying AWS\n
","location":"reference/cli/dns53/#flags"},{"title":"Commands","text":"
completion  Generate completion script for your target shell\nhelp        Help about any command\nimds        Toggle EC2 IMDS features\nversion     Prints the build time version information\n
","location":"reference/cli/dns53/#commands"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"DNS 53","text":"

Dynamic DNS within Amazon Route 53. Expose your EC2 quickly, easily, and privately within a Route 53 Private Hosted Zone (PHZ).

Easily collaborate with a colleague by exposing your EC2 within a team VPC. You could even hook up a locally running application to a local k3d cluster using an ExternalName service during development. Once your EC2 is exposed, control how it is accessed through your EC2 security groups.

"},{"location":"license/","title":"License","text":"

MIT License

Copyright (c) 2022 - 2023 Purple Clay

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

"},{"location":"configure/auto-attachment/","title":"Auto Attachment of your EC2","text":"

Your EC2 can automatically be attached to a default Route53 Private Hosted Zone (PHZ) called dns53.

dns53 --auto-attach\n

For this to work as intended, dns53 handles two attachment scenarios, removing the need for any PHZ management. \ud83d\udc4d

"},{"location":"configure/auto-attachment/#you-are-the-first-auto-attachment","title":"You are the first Auto Attachment","text":"

Congratulations, you beat everyone else in your team or organisation and auto-attached your EC2 to the default dns53 PHZ. dns53 will:

  1. Create the new dns53 PHZ and associate the launched EC2 VPC with it.
  2. Broadcasts your EC2 as expected, using a custom domain name if provided.
  3. Tidies everything up when you exit.
"},{"location":"configure/auto-attachment/#auto-attachment-has-already-happened","title":"Auto Attachment has already happened","text":"

If someone in your team, or organisation, was super keen and already auto-attached their EC2 to the default dns53 PHZ, your attachment will be slightly different. dns53 will:

  1. Check if your launched EC2 is within a VPC associated with the PHZ. If not, it will create a new association.
  2. Broadcasts your EC2 as expected, using a custom domain name if provided.
  3. Tidies everything up when you exit.
"},{"location":"configure/auto-attachment/#a-10000-foot-view","title":"A 10,000-foot view","text":""},{"location":"configure/broadcast-ec2/","title":"Privately Broadcast your EC2","text":"

To broadcast your EC2 privately within your VPC couldn't be easier. Launch the wizard and follow the on-screen prompts:

dns53\n
"},{"location":"configure/broadcast-ec2/#default-domain-name","title":"Default Domain Name","text":"

A default domain name will be assigned to your EC2 when dns53 adds an A-Record to the chosen Route53 Private Hosted Zone (PHZ).

It follows the format:

<EC2_PRIVATE_IPv4>.dns53.<PHZ_ROOT_DOMAIN> ~> 10-0-1-182.dns53.testing

"},{"location":"configure/broadcast-ec2/#skipping-the-wizard","title":"Skipping the Wizard","text":"

If you have the ID of your Route53 PHZ handy, you can skip the wizard and immediately broadcast your EC2:

dns53 --phz-id Z05504861FO8RFR02KU72\n
"},{"location":"configure/custom-domain/","title":"Using a Custom Domain Name","text":"

If you want complete control of the domain name associated with your EC2, you can customise it in one of two ways.

Route53 Root Domain is Optional

dns53 will automatically append the Route53 root domain when creating the A-Record. Feel free to omit this when providing a custom domain

"},{"location":"configure/custom-domain/#static-domain","title":"Static Domain","text":"
dns53 --domain-name \"my.ec2\"\n
"},{"location":"configure/custom-domain/#templated-domain","title":"Templated Domain","text":"

A templated domain leverages the text templating capabilities of the Go language to replace named fields with concrete values. A list of supported named fields can be found here.

dns53 --domain-name \"{{.IPv4}}.{{.Region}}\"\n
"},{"location":"configure/custom-domain/#domain-validation","title":"Domain Validation","text":"

A custom domain must be valid before assigning it to your EC2 instance. A series of checks must pass.

A domain must:

  • not contain leading or trailing hyphens (-) and dots (.)
  • not contain consecutive hyphens (--) or dots (..)
  • not contain whitespace ()
  • only contain valid characters from the sequence [A-Za-z0-9-.]

dns53 will automatically clean any domain name in an attempt to enforce these validation checks.

"},{"location":"configure/exposing-tags/","title":"Exposing EC2 Instance Tags","text":"

By default, EC2 tags are not accessible through the Instance Metadata Service (IMDS) and subsequently by dns53. Granting access to EC2 instance tags can be carried out manually1 or with the following custom command:

dns53 imds --instance-metadata-tags on\n
"},{"location":"configure/exposing-tags/#cleaning-tag-names","title":"Cleaning Tag Names","text":"

All tags accessible through IMDS will subsequently be \"cleaned\" and made available for crafting custom domain names. A Pascal Case naming convention is applied to all tags when stored within an internal map alongside their originally named counterpart, and both are accessible through templating.

  1. Access to EC2 instance tags can be granted directly through the AWS Console or by using the CLI as documented here \u21a9

"},{"location":"configure/iam/","title":"IAM Permissions","text":"

Access to Route53 and EC2 is required for dns53 to work. Your IAM persona must have the following permissions granted:

{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"route53:AssociateVPCWithHostedZone\",\n        \"route53:ChangeResourceRecordSets\",\n        \"route53:DeleteHostedZone\",\n        \"route53:DisassociateVPCFromHostedZone\",\n        \"route53:GetHostedZone\"\n      ],\n      \"Resource\": \"arn:aws:route53:::hostedzone/*\"\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"ec2:DescribeVpcs\",\n        \"route53:CreateHostedZone\",\n        \"route53:ListHostedZonesByName\",\n        \"route53:ListHostedZonesByVPC\"\n      ],\n      \"Resource\": \"*\"\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\"ec2:ModifyInstanceMetadataOptions\"],\n      \"Resource\": \"arn:aws:ec2:<REGION>:<ACCOUNT>:instance/*\" // (1)!\n    }\n  ]\n}\n
  1. Don't forget to replace the <REGION> and <ACCOUNT> placeholders with your specific AWS details, e.g. arn:aws:ec2:eu-west-2:112233445566:instance/*. You could also lock it down to a specific EC2 instance if you wanted

Aim for Least Privilege

It would be best if you fine-tuned this policy further to restrict access and adopt the mantra of \"least privilege\". You accept this policy at your own risk

"},{"location":"configure/list-tags/","title":"List Available EC2 Instance Tags","text":"

To generate a cheat sheet for including EC2 instance tags within a custom domain using Go templating, run the following command:

dns tags\n
"},{"location":"configure/tracing-requests/","title":"Tracing Requests with a Reverse Proxy","text":"

To trace requests sent to your broadcasted EC2, dns53 comes bundled with an internal reverse proxy. To enable proxying:

dns53 --proxy\n

Once enabled, set the required environment variables to trace both HTTP and HTTPS requests. It is advised not to proxy any requests to IMDS on your EC2.

export HTTP_PROXY=http://localhost:10080\nexport HTTPS_PROXY=http://localhost:10080\nexport NO_PROXY=169.254.169.254\n
curl http://httpbin.org/headers\n
curl https://httpbin.org/ip -k\n

If you do not wish to set any of these environment variables, your preferred CLI tool should support request proxying using a dedicated flag. For curl, that is -x.

"},{"location":"configure/tracing-requests/#changing-the-proxy-port","title":"Changing the proxy port","text":"

Feel free to change the default proxy port of :10080 by using the proxy-port flag:

dns53 --proxy --proxy-port 10888\n
"},{"location":"install/binary/","title":"Installing the Binary","text":"

You can use various package managers to install the dns53 binary. Take your pick.

"},{"location":"install/binary/#package-managers","title":"Package Managers","text":""},{"location":"install/binary/#homebrew","title":"Homebrew","text":"

To use Homebrew:

brew install purpleclay/tap/dns53\n
"},{"location":"install/binary/#scoop","title":"Scoop","text":"

To use Scoop:

scoop bucket add purpleclay https://github.com/purpleclay/scoop-bucket.git\nscoop install dns53\n
"},{"location":"install/binary/#apt","title":"Apt","text":"

To install using the apt package manager:

echo 'deb [trusted=yes] https://fury.purpleclay.dev/apt/ /' | sudo tee /etc/apt/sources.list.d/purpleclay.list\nsudo apt update\nsudo apt install -y dns53\n

You may need to install the ca-certificates package if you encounter trust issues with regard to the Gemfury certificate:

sudo apt update && sudo apt install -y ca-certificates\n
"},{"location":"install/binary/#yum","title":"Yum","text":"

To install using the yum package manager:

echo '[purpleclay]\nname=purpleclay\nbaseurl=https://fury.purpleclay.dev/yum/\nenabled=1\ngpgcheck=0' | sudo tee /etc/yum.repos.d/purpleclay.repo\nsudo yum install -y dns53\n
"},{"location":"install/binary/#aur","title":"Aur","text":"

To install from the aur using yay:

yay -S dns53-bin\n
"},{"location":"install/binary/#linux-packages","title":"Linux Packages","text":"

Download and manually install one of the .deb, .rpm or .apk packages from the Releases page.

AptYumApk
sudo apt install dns53_*.deb\n
sudo yum localinstall dns53_*.rpm\n
sudo apk add --no-cache --allow-untrusted dns53_*.apk\n
"},{"location":"install/binary/#go-install","title":"Go Install","text":"
go install github.com/purpleclay/dns53@latest\n
"},{"location":"install/binary/#bash-script","title":"Bash Script","text":"

To install the latest version using a bash script:

curl https://raw.githubusercontent.com/purpleclay/dns53/main/scripts/install | bash\n

Download a specific version using the -v flag. The script uses sudo by default but can be disabled through the --no-sudo flag.

curl https://raw.githubusercontent.com/purpleclay/dns53/main/scripts/install | bash -s -- -v v0.1.0 --no-sudo\n
"},{"location":"install/binary/#manual-download-of-binary","title":"Manual Download of Binary","text":"

Head over to the Releases page on GitHub and download any release artefact. Unpack the dns53 binary and add it to your PATH.

"},{"location":"install/binary/#verifying-a-binary-with-cosign","title":"Verifying a Binary with Cosign","text":"

All binaries can be verified using cosign.

  1. Download the checksum files that need to be verified:
curl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt -O\ncurl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt.sig -O\ncurl -sL https://github.com/purpleclay/dns53/releases/download/v0.8.0/checksums.txt.pem -O\n
  1. Verify the signature of the checksum file:
cosign verify-blob --cert checksums.txt.pem --signature checksums.txt.sig checksums.txt\n
  1. Download any release artefact and verify its SHA256 signature matches the entry within the checksum file:
sha256sum --ignore-missing -c checksums.txt\n
"},{"location":"install/source/","title":"Compiling from Source","text":"

Download both Go 1.21+ and go-task. Then clone the code from GitHub:

git clone https://github.com/purpleclay/dns53.git\ncd dns53\n

Build:

task\n

And check that everything works:

./dns53 version\n
"},{"location":"reference/templating/","title":"Go Templates","text":"

Full support for Go templates through a series of predefined named fields allows `dns53`` to support a dynamic configuration where needed.

Table Key

This is a living table and will change as new features are released.

  • : the metadata was formatted to ensure it is URL compliant
  • : the metadata was retrieved from EC2 instance tags; this feature must be enabled
"},{"location":"reference/templating/#named-fields","title":"Named Fields","text":"

The following named fields directly access metadata about your EC2 from the Instance Metadata Service (IMDS).

Named Field Description Example {{.IPv4}} the private IPv4 address of the EC2 instance 10-0-1-182 {{.Region}} the region of the EC2 instance eu-west-2 {{.VPC}} the VPC ID of where the EC2 instance was launched vpc-016d173db537793d1 {{.AZ}} the availability zone (AZ) of the EC2 instance eu-west-2a {{.InstanceID}} the unique ID of the EC2 instance i-03e092f544905abb2 {{.Name}} a name assigned to the EC2 instance dev-ec2"},{"location":"reference/templating/#dynamic-tags","title":"Dynamic Tags","text":"

As the IMDS service exposes all EC2 instance tags (once enabled), you can access them in much the same way as other named fields. Internally dns53 stores all tags within a Tags map and provides access to them in two ways.

  1. Directly through property chaining1, {{.Tags.Key}}
  2. Or by using the inbuilt Go templating index function, {{index .Tags \"Key\"}}
Named Field Description Examples {{.Tags.Ec2Role}} the role assigned to this EC2 instance development {{index .Tags \"ec2:role\"}} the role assigned to this EC2 instance development
  1. Amazon's tag naming and usage guidelines permit characters not supported by Go templating for property chaining, namely [+ - = . , _ : @]. A best efforts approach was adopted to clean the name of the tag; for further details, please read the following documentation.\u00a0\u21a9

"},{"location":"reference/cli/dns53-imds/","title":"Command Line","text":"

Toggle EC2 IMDS features

"},{"location":"reference/cli/dns53-imds/#usage","title":"Usage","text":"
dns53 imds [flags]\n
"},{"location":"reference/cli/dns53-imds/#flags","title":"Flags","text":"
-h, --help                            help for imds\n    --instance-metadata-tags string   toggle the inclusion of EC2 instance tags\n                                      within IMDS (on|off)\n
"},{"location":"reference/cli/dns53-imds/#global-flags","title":"Global Flags","text":"
--profile string   the AWS named profile to use when loading credentials\n--region string    the AWS region to use when querying AWS\n
"},{"location":"reference/cli/dns53-tags/","title":"Command Line","text":"

Lists all available EC2 instance tags and how to use them with Go templating

"},{"location":"reference/cli/dns53-tags/#usage","title":"Usage","text":"
dns53 tags [flags]\n
"},{"location":"reference/cli/dns53-tags/#flags","title":"Flags","text":"
-h, --help   help for tags\n
"},{"location":"reference/cli/dns53-tags/#global-flags","title":"Global Flags","text":"
--profile string   the AWS named profile to use when loading credentials\n--region string    the AWS region to use when querying AWS\n
"},{"location":"reference/cli/dns53/","title":"Command Line","text":"

Dynamic DNS within Amazon Route 53. Expose your EC2 quickly, easily, and privately within a Route 53 Private Hosted Zone (PHZ).

Your EC2 will be exposed through a dynamically generated resource record that will automatically be deleted when dns53 exits. Let dns53 name your resource record for you, or customise it to your needs.

"},{"location":"reference/cli/dns53/#usage","title":"Usage","text":"
dns53 [flags]\ndns53 [command]\n
"},{"location":"reference/cli/dns53/#flags","title":"Flags","text":"
    --auto-attach          automatically create and attach a record set to a\n                           default private hosted zone\n    --domain-name string   assign a custom domain name when generating a record\n                           set\n-h, --help                 help for dns53\n    --phz-id string        an ID of a Route53 private hosted zone to use when\n                           generating a record set\n    --profile string       the AWS named profile to use when loading credentials\n    --proxy                enable a reverse proxy for tracing requests to this\n                           ec2\n    --proxy-port int       the port assigned to the proxy when enabled\n                           (default 10080)\n    --region string        the AWS region to use when querying AWS\n
"},{"location":"reference/cli/dns53/#commands","title":"Commands","text":"
completion  Generate the autocompletion script for the specified shell\nhelp        Help about any command\nimds        Toggle EC2 IMDS features\ntags        Lists all available EC2 instance tags and how to use them with Go\n            templating\nversion     Print build time version information\n
"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 6dda952..3c6b38c 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,72 +2,77 @@ https://docs.purpleclay.dev/dns53/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/license/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/configure/auto-attachment/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/configure/broadcast-ec2/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/configure/custom-domain/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/configure/exposing-tags/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/configure/iam/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/configure/list-tags/ - 2022-11-09 + 2023-11-13 + daily + + + https://docs.purpleclay.dev/dns53/configure/tracing-requests/ + 2023-11-13 daily https://docs.purpleclay.dev/dns53/install/binary/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/install/source/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/reference/templating/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/reference/cli/dns53-imds/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/reference/cli/dns53-tags/ - 2022-11-09 + 2023-11-13 daily https://docs.purpleclay.dev/dns53/reference/cli/dns53/ - 2022-11-09 + 2023-11-13 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index d501f29..2675287 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000..1b09f2e Binary files /dev/null and b/static/favicon.ico differ diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000..6dc4b95 Binary files /dev/null and b/static/logo.png differ diff --git a/stylesheets/extra.css b/stylesheets/extra.css new file mode 100644 index 0000000..0215db3 --- /dev/null +++ b/stylesheets/extra.css @@ -0,0 +1,39 @@ +.md-banner { + color: var(--md-footer-fg-color--lighter); +} + +.md-banner strong { + color: var(--md-footer-fg-color); +} + +.md-typeset .mastodon { + color: #897ff8; +} + +.md-typeset .twitter { + color: #00acee; +} + +.md-typeset a:hover>span * { + filter: brightness(85%); +} + +.new-feature { + color: #006C39; +} + +.rounded-pill { + background-color: var(--md-primary-fg-color); + color: var(--md-primary-bg-color); + border-radius: 2em; + padding: 0.4em 0.8em; + text-align: center; + font-size: 0.7em; + font-weight: bold; +} + +u { + text-decoration: underline; + text-decoration-style: dotted; + text-underline-offset: 0.3em; +}