{"id":455,"date":"2019-09-12T16:44:37","date_gmt":"2019-09-12T07:44:37","guid":{"rendered":"https:\/\/weseek.co.jp\/tech\/?p=455"},"modified":"2023-04-17T11:46:31","modified_gmt":"2023-04-17T02:46:31","slug":"kubernetes-lets-encrypt-%e3%81%a7%e3%83%af%e3%82%a4%e3%83%ab%e3%83%89%e3%82%ab%e3%83%bc%e3%83%89%e8%a8%bc%e6%98%8e%e6%9b%b8%e3%82%92%e8%87%aa%e5%8b%95%e7%99%ba%e8%a1%8c%e3%81%a7%e3%81%8d","status":"publish","type":"post","link":"https:\/\/weseek.co.jp\/tech\/455\/","title":{"rendered":"Kubernetes+Let\u2019s Encrypt\u3067\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9\u8a3c\u660e\u66f8\u306e\u81ea\u52d5\u767a\u884c\u57fa\u76e4\u3092\u4f5c\u308b"},"content":{"rendered":"<h1>\u306f\u3058\u3081\u306b<\/h1>\n<p>SEROKU \u306e\u958b\u767a\u30d5\u30ed\u30fc\u3067\u306f\u3001\u958b\u767a\u7528\u306e\u30ea\u30dd\u30b8\u30c8\u30ea\u306b Mercurial \u3092\u7528\u3044\u3001\u5404\u6a5f\u80fd\u5b9f\u88c5\u3054\u3068\u306b\u30d6\u30e9\u30f3\u30c1\u3092\u7528\u610f\u3057\u305f\u4e0a\u3067\u958b\u767a\u3092\u884c\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u305d\u306e\u4e0a\u3067\u3055\u3089\u306b\u3001\u793e\u5185\u306b Kubernetes \u30af\u30e9\u30b9\u30bf\u3092\u7528\u610f\u3057\u3066\u3001\u30d6\u30e9\u30f3\u30c1\u3054\u3068\u306b\u30c7\u30e2\u74b0\u5883\u3092\u7acb\u3061\u4e0a\u3052\u3089\u308c\u308b\u3088\u3046\u306a\u4ed5\u7d44\u307f\u3092\u6574\u5099\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u95a2\u9023\u8a18\u4e8b<\/p>\n<p><a href=\"https:\/\/weseek.co.jp\/tech\/682\/\">SaaS\u904b\u7528\u3067\u306e\u5927\u969c\u5bb3\u306e\u601d\u3044\u51fa\u3068\u5bfe\u7b56\u306e\u5171\u6709(\u5927\u5674\u706b\u7de8)<\/a><\/p>\n<p><a href=\"https:\/\/weseek.co.jp\/tech\/353\/\">Kubernetes\u6642\u4ee3\u306eCI\/CD Jenkins X\u3068\u306f?-\u524d\u7de8<\/a><\/p>\n<p>\u5f53\u521d\u306f\u3001\u5404\u30d6\u30e9\u30f3\u30c1\u3054\u3068\u306b\u30c9\u30e1\u30a4\u30f3\u3092\u4f5c\u6210\u3057\u3001Let\u2019s Encrypt \u306b\u3088\u308b SSL \u8a3c\u660e\u66f8\u3092\u767a\u884c\u3057\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001\u4e26\u884c\u3067\u958b\u767a\u3059\u308b\u30d6\u30e9\u30f3\u30c1\u6570\u304c\u591a\u304f\u306a\u3063\u3066\u304f\u308b\u3068\u3084\u304c\u3066 rate-limit \u306b\u5f53\u305f\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<br \/>\n(\u53c2\u8003: <a href=\"https:\/\/letsencrypt.org\/docs\/rate-limits\/\">Rate Limits \u2013 Let\u2019s Encrypt \u2013 Free SSL\/TLS Certificates<\/a>)<\/p>\n<p>\u4eca\u56de\u306f\u3001\u305d\u308c\u3092\u56de\u907f\u3059\u308b\u305f\u3081\u306b\u5fc5\u8981\u3068\u306a\u3063\u305f\u3001Kubernetes \u30af\u30e9\u30b9\u30bf\u4e0a\u3067 Let\u2019s Encrypt \u3092\u7528\u3044\u305f\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9\u8a3c\u660e\u66f8\u3092\u81ea\u52d5\u767a\u884c\u30fb\u66f4\u65b0\u3067\u304d\u308b\u57fa\u76e4\u306e\u4f5c\u308a\u65b9\u306b\u3064\u3044\u3066\u3054\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n<p>\u5f0a\u793e\u3067\u306f AWS Route 53 \u3067\u30c9\u30e1\u30a4\u30f3\u3092\u7ba1\u7406\u3057\u3066\u3044\u308b\u305f\u3081\u3001\u672c\u8a18\u4e8b\u3067\u306f Route 53 \u3092\u5229\u7528\u3057\u305f\u30c9\u30e1\u30a4\u30f3\u3092\u5bfe\u8c61\u3068\u3057\u307e\u3059\u3002<\/p>\n<p><!--more--><\/p>\n\n<h1>\u5fc5\u8981\u3068\u306a\u308b\u524d\u63d0\u77e5\u8b58<\/h1>\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u6280\u8853\u7528\u8a9e\u306b\u3064\u3044\u3066\u306f\u8aac\u660e\u3044\u305f\u3057\u307e\u305b\u3093\u306e\u3067\u3001\u307e\u3060\u3054\u5b58\u77e5\u306a\u3044\u3068\u3044\u3046\u65b9\u306f\u53c2\u8003\u30b5\u30a4\u30c8\u3092\u3054\u89a7\u306b\u306a\u3063\u3066\u304b\u3089\u672c\u8a18\u4e8b\u3092\u3054\u89a7\u306b\u306a\u308b\u3068\u3001\u3088\u308a\u7406\u89e3\u304c\u9032\u3080\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<ul>\n<li>Kubernetes\n<ul>\n<li><a href=\"https:\/\/kubernetes.io\/\">Kubernetes: Production-Grade Container Orchestration<\/a><\/li>\n<li><a href=\"https:\/\/qiita.com\/MahoTakara\/items\/85096f8b2632c802ab22\">\u4eca\u3055\u3089\u4eba\u306b\u805e\u3051\u306a\u3044 Kubernetes \u3068\u306f\uff1f \u2013 Qiita<\/a><\/li>\n<\/ul>\n<\/li>\n<li>Ingress\n<ul>\n<li><a href=\"https:\/\/codezine.jp\/article\/detail\/10523\">Kubernetes\u30af\u30e9\u30b9\u30bf\u306bService\u3068Ingress\u3092\u8ffd\u52a0\u3057\u3001Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5916\u90e8\u306b\u516c\u958b<\/a><\/li>\n<li><a href=\"https:\/\/qiita.com\/Hirata-Masato\/items\/8e6b4536b6f1b23c5270\">kubernetes\u306bingress\u3092\u5c0e\u5165\u3059\u308b\u65b9\u6cd5 \u2013 Qiita<\/a><\/li>\n<\/ul>\n<\/li>\n<li>Helm\n<ul>\n<li><a href=\"https:\/\/helm.sh\/\">Helm \u2013 The Kubernetes Package Manager<\/a><\/li>\n<\/li>\n<li><a href=\"https:\/\/qiita.com\/tkusumi\/items\/12857780d8c8463f9b9c\">Kubernetes: \u30d1\u30c3\u30b1\u30fc\u30b8\u30de\u30cd\u30fc\u30b8\u30e3Helm \u2013 Qiita<\/a><\/li>\n<\/ul>\n<\/li>\n<li>Let\u2019s Encrypt\n<ul>\n<li><a href=\"https:\/\/letsencrypt.org\/\">Let\u2019s Encrypt \u2013 Free SSL\/TLS Certificates<\/a><\/li>\n<li><a href=\"https:\/\/free-ssl.jp\/\">Let\u2019s Encrypt \u7dcf\u5408\u30dd\u30fc\u30bf\u30eb<\/a><\/li>\n<\/ul>\n<\/li>\n<li>\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9\u8a3c\u660e\u66f8\n<ul>\n<li><a href=\"https:\/\/www.toritonssl.com\/about_ssl\/wildcard_ssl_certificate.html\">\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9 SSL\u30b5\u30fc\u30d0\u8a3c\u660e\u66f8\u3068\u306f\uff1f<\/a><\/li>\n<\/ul>\n<\/li>\n<li>DNS-01\n<ul>\n<li><a href=\"https:\/\/blog.jicoman.info\/2017\/04\/certbot_dns_01\/\">Certbot\u3067DNS\u306b\u3088\u308b\u8a8d\u8a3c(DNS-01)\u3067\u7121\u6599\u306eSSL\/TLS\u8a3c\u660e\u66f8\u3092\u53d6\u5f97\u3059\u308b<\/a><\/li>\n<\/ul>\n<\/li>\n<li>AWS Route 53\n<ul>\n<li><a href=\"https:\/\/aws.amazon.com\/jp\/route53\/\">Amazon Route 53\uff08\u30af\u30e9\u30a6\u30c9 DNS \u2013 \u30c9\u30e1\u30a4\u30f3\u30cd\u30fc\u30e0\u30b5\u30fc\u30d0\u30fc\uff09 | AWS<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h1>\u57fa\u76e4\u69cb\u7bc9\u306b\u3042\u305f\u3063\u3066\u5fc5\u8981\u3068\u306a\u308b\u30b9\u30bf\u30fc\u30c8\u6761\u4ef6<\/h1>\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u6761\u4ef6\u304c\u63c3\u3063\u305f\u72b6\u614b\u3092\u30b9\u30bf\u30fc\u30c8\u306b\u5fc5\u8981\u306a\u6761\u4ef6\u3068\u3057\u307e\u3059\u3002<\/p>\n<ol>\n<li>\n<p><code>kubectl<\/code> \u30b3\u30de\u30f3\u30c9\u3092\u5229\u7528\u3057\u3066\u3001Kubernetes \u30af\u30e9\u30b9\u30bf\u306b\u30ed\u30b0\u30a4\u30f3\u30fb\u64cd\u4f5c\u3067\u304d\u308b\u3053\u3068<\/p>\n<\/li>\n<li>\n<p><code>helm<\/code> \u30b3\u30de\u30f3\u30c9\u3092\u5229\u7528\u3057\u3066\u3001Kubernetes \u30af\u30e9\u30b9\u30bf\u306b\u4efb\u610f\u306e Chart \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u308b\u3053\u3068<\/p>\n<\/li>\n<li>\n<p>\u8a3c\u660e\u66f8\u3092\u767a\u884c\u3059\u308b\u4e88\u5b9a\u306e\u30c9\u30e1\u30a4\u30f3\u3092\u4fdd\u6301\u3057\u3066\u3044\u308b\u3053\u3068<\/p>\n<ul>\n<li>\u672c\u8a18\u4e8b\u3067\u306f\u3001\u8a3c\u660e\u66f8\u3092\u767a\u884c\u3059\u308b\u5bfe\u8c61\u30c9\u30e1\u30a4\u30f3\u3092<code>example.com<\/code> \u3068\u3057\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>AWS Route 53 \u3067\u4e0a\u8a18\u30c9\u30e1\u30a4\u30f3\u304c\u7ba1\u7406\u3067\u304d\u3066\u3044\u308b\u3053\u3068<\/p>\n<ul>\n<li>\u30c9\u30e1\u30a4\u30f3\u306e NS \u30ec\u30b3\u30fc\u30c9\u304c Route 53 \u306b\u5411\u3044\u3066\u3044\u308b\u3053\u3068\u3092\u524d\u63d0\u3068\u3057\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h1>\u672c\u8a18\u4e8b\u306e\u30b4\u30fc\u30eb<\/h1>\n<p>Kubernetes \u30af\u30e9\u30b9\u30bf\u4e0a\u3067\u4ee5\u4e0b\u304c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308b\u3053\u3068\u3092\u30b4\u30fc\u30eb\u3068\u3057\u307e\u3059\u3002<\/p>\n<ul>\n<li>\u4fdd\u6301\u3057\u3066\u3044\u308b\u30c9\u30e1\u30a4\u30f3\u306b\u95a2\u3059\u308b\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9\u8a3c\u660e\u66f8\u3092\u767a\u884c\u3067\u304d\u308b\u3053\u3068<\/li>\n<li>\u767a\u884c\u3057\u305f\u8a3c\u660e\u66f8\u3092\u5229\u7528\u3057\u3066\u3001\u4efb\u610f\u306e Web \u30b5\u30fc\u30d3\u30b9\u3092\u516c\u958b\u3067\u304d\u308b\u3053\u3068<\/li>\n<\/ul>\n<h1>\u672c\u8a18\u4e8b\u3067\u3054\u7d39\u4ecb\u3059\u308b\u30df\u30c9\u30eb\u30a6\u30a7\u30a2(cert-manager)\u306b\u3064\u3044\u3066<\/h1>\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001Kubernetes \u30af\u30e9\u30b9\u30bf\u4e0a\u3067\u8a3c\u660e\u66f8\u306e\u81ea\u52d5\u767a\u884c\u30fb\u66f4\u65b0\u3092\u62c5\u3063\u3066\u304f\u308c\u308b\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3068\u3057\u3066 <a href=\"https:\/\/github.com\/jetstack\/cert-manager\">cert-manager<\/a> v0.3.0(\u57f7\u7b46\u6642\u6700\u65b0) \u3092\u5229\u7528\u3057\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306f\u3001Let\u2019s Encrypt \u3067\u8a3c\u660e\u66f8\u3092\u767a\u884c\u30fb\u66f4\u65b0\u3059\u308b\u4e0a\u3067\u5fc5\u8981\u3068\u306a\u308b\u4ee5\u4e0b\u306e\u4f5c\u696d\u3092\u81ea\u52d5\u5316\u3057\u3066\u304f\u308c\u307e\u3059\u3002<\/p>\n<ul>\n<li>Let\u2019s Encrypt API \u3078\u9069\u5b9c\u30a2\u30af\u30bb\u30b9\u3057\u3001\u30c9\u30e1\u30a4\u30f3\u691c\u8a3c\u7528\u30b3\u30fc\u30c9\u3092\u767a\u884c\u3057\u3001\u8a3c\u660e\u66f8\u3092\u767a\u884c\u3059\u308b<\/li>\n<li>Route 53 \u3078\u306e\u30c9\u30e1\u30a4\u30f3\u691c\u8a3c\u7528 TXT \u30ec\u30b3\u30fc\u30c9\u306e\u4f5c\u6210<\/li>\n<li>\u767a\u884c\u3057\u305f\u8a3c\u660e\u66f8\u3092 Kubernetes \u30af\u30e9\u30b9\u30bf\u3078\u683c\u7d0d\u3059\u308b<\/li>\n<\/ul>\n<h1>\u69cb\u7bc9\u624b\u9806<\/h1>\n<h2>1. AWS IAM role \u306e\u7528\u610f<\/h2>\n<p>\u307e\u305a\u3001cert-manager \u304c Route 53 \u3092\u64cd\u4f5c\u3059\u308b\u305f\u3081\u306b\u5fc5\u8981\u306a\u30e6\u30fc\u30b6\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<ol>\n<li><a href=\"https:\/\/console.aws.amazon.com\/iam\/home\">AWS IAM \u306e Management Console<\/a> \u3078\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059<\/li>\n<li>\u5de6\u5074\u306e\u30b5\u30a4\u30c9\u30d0\u30fc\u3088\u308a\u300c\u30e6\u30fc\u30b6\u30fc\u300d\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059<\/li>\n<li>\u4e0a\u90e8\u306b\u3042\u308b\u300c\u30e6\u30fc\u30b6\u30fc\u3092\u8ffd\u52a0\u300d\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059<\/li>\n<li>\u300c\u30e6\u30fc\u30b6\u30fc\u540d\u300d\u306b\u9069\u5f53\u306a\u6587\u5b57\u5217\u3092\u5165\u308c\u307e\u3059\n<ul>\n<li>\u81ea\u5206\u304c\u5f8c\u3067\u898b\u3066\u5206\u304b\u308a\u3084\u3059\u3044\u6587\u5b57\u5217\u3092\u5165\u529b\u3057\u3066\u304a\u304d\u307e\u3057\u3087\u3046<\/li>\n<li>\u4f8b: <code>k8s-cert-manager<\/code> \u306a\u3069<\/li>\n<\/ul>\n<\/li>\n<li>\u300c\u30a2\u30af\u30bb\u30b9\u306e\u7a2e\u985e\u300d\u306f\u300c\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u3088\u308b\u30a2\u30af\u30bb\u30b9\u300d\u306b\u30c1\u30a7\u30c3\u30af\u3092\u5165\u308c\u307e\u3059<\/li>\n<li>\u300c\u6b21\u306e\u30b9\u30c6\u30c3\u30d7: \u30a2\u30af\u30bb\u30b9\u6a29\u9650\u300d\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059<\/li>\n<li>\u300cxxx \u306e\u30a2\u30af\u30bb\u30b9\u6a29\u9650\u3092\u8a2d\u5b9a\u300d\u306e\u7b87\u6240\u3067\u3001\u300c\u65e2\u5b58\u306e\u30dd\u30ea\u30b7\u30fc\u3092\u76f4\u63a5\u30a2\u30bf\u30c3\u30c1\u300d\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059<\/li>\n<li>\u300c\u30dd\u30ea\u30b7\u30fc\u306e\u4f5c\u6210\u300d\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059<\/li>\n<li>\u958b\u3044\u305f\u30bf\u30d6\/\u30a6\u30a3\u30f3\u30c9\u30a6\u306e\u4e2d\u3067\u300cJSON\u300d\u30bf\u30d6\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059<\/li>\n<li>\u51fa\u3066\u304d\u305f\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u306b\u4ee5\u4e0b\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u30b3\u30d4\u30fc\u3057\u307e\u3059\n<pre><code>{\n    &quot;Version&quot;: &quot;2012-10-17&quot;,\n    &quot;Statement&quot;: [\n        {\n            &quot;Effect&quot;: &quot;Allow&quot;,\n            &quot;Action&quot;: &quot;route53:GetChange&quot;,\n            &quot;Resource&quot;: &quot;arn:aws:route53:::change\/*&quot;\n        },\n        {\n            &quot;Effect&quot;: &quot;Allow&quot;,\n            &quot;Action&quot;: &quot;route53:ChangeResourceRecordSets&quot;,\n            &quot;Resource&quot;: &quot;arn:aws:route53:::hostedzone\/*&quot;\n        },\n        {\n            &quot;Effect&quot;: &quot;Allow&quot;,\n            &quot;Action&quot;: &quot;route53:ListHostedZonesByName&quot;,\n            &quot;Resource&quot;: &quot;*&quot;\n        }\n    ]\n}<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/docs.cert-manager.io\/en\/latest\/tasks\/issuers\/setup-acme\/dns01\/route53.html\">\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8 <\/a>\u306b IAM \u306b\u8a2d\u5b9a\u3059\u3079\u304d\u30dd\u30ea\u30b7\u30fc\u304c\u8a18\u8f09\u3055\u308c\u3066\u3044\u307e\u3059\u304c\u3001\u305d\u306e\u5185\u5bb9\u3060\u3068 cert-manager \u304c\u3046\u307e\u304f Route 53 \u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u306a\u3044\u305f\u3081\u3001<a href=\"https:\/\/github.com\/jetstack\/cert-manager\/issues\/403#issuecomment-381054872\">\u3053\u3061\u3089\u306e Issue <\/a>\u306b\u6319\u304c\u3063\u3066\u3044\u308b\u30dd\u30ea\u30b7\u30fc\u3092\u4f7f\u3044\u307e\u3059((2019\/09\/12 \u73fe\u5728\u4fee\u6b63\u3055\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059))<\/li>\n<\/ul>\n<\/li>\n<li>\u753b\u9762\u4e0b\u90e8\u306b\u3042\u308b\u300cReview Policy\u300d\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059<\/li>\n<li>\u300c\u540d\u524d\u300d\u306b\u9069\u5f53\u306a\u6587\u5b57\u5217\u3092\u5165\u529b\u3057\u307e\u3059\n<ul>\n<li>\u4f8b: <code>route53-access-for-cert-manager<\/code><\/li>\n<\/ul>\n<\/li>\n<li>\u300cCreate Policy\u300d\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059<\/li>\n<li>\u300cxxx \u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u300d\u3068\u3044\u3046\u8868\u793a\u304c\u78ba\u8a8d\u51fa\u6765\u305f\u3089\u3001\u305d\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\/\u30bf\u30d6\u306f\u9589\u3058\u3066\u304f\u3060\u3055\u3044<\/li>\n<li>\u5143\u306e\u30e6\u30fc\u30b6\u8ffd\u52a0\u753b\u9762\u3067\u300c\u66f4\u65b0\u300d\u30dc\u30bf\u30f3\u3092\u62bc\u3057\u3066\u304b\u3089\u3001\u4f5c\u6210\u3057\u305f\u30dd\u30ea\u30b7\u30fc\u3092\u691c\u7d22\u3057\u3001\u753b\u9762\u5de6\u7aef\u306e\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u3092\u30aa\u30f3\u306b\u3057\u307e\u3059<\/li>\n<li>\u300c\u6b21\u306e\u30b9\u30c6\u30c3\u30d7: \u78ba\u8a8d\u300d\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059<\/li>\n<li>\u5185\u5bb9\u306b\u554f\u984c\u304c\u306a\u3044\u3088\u3046\u3067\u3042\u308c\u3070\u3001\u305d\u306e\u307e\u307e\u300c\u30e6\u30fc\u30b6\u30fc\u306e\u4f5c\u6210\u300d\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059<\/li>\n<li>\u4f5c\u6210\u306b\u5b8c\u4e86\u3059\u308b\u3068\u3001\u30a2\u30af\u30bb\u30b9\u30ad\u30fcID\/\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u30a2\u30af\u30bb\u30b9\u30ad\u30fc\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u306e\u3067\u3001<strong>\u5fd8\u308c\u305a\u306b\u30e1\u30e2\u3057\u307e\u3057\u3087\u3046<\/strong>\n<ul>\n<li>\u3053\u3053\u3067\u8868\u793a\u3055\u308c\u308b\u30a2\u30af\u30bb\u30b9\u30ad\u30fcID\/\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u30a2\u30af\u30bb\u30b9\u30ad\u30fc\u3092\u3053\u306e\u5f8c\u306e\u624b\u9806\u3067\u5229\u7528\u3057\u307e\u3059<\/li>\n<li>\u3061\u306a\u307f\u306b\u30e1\u30e2\u3057\u5fd8\u308c\u305f\u3068\u3057\u3066\u3082\u3001\u4eca\u56de\u4f5c\u6210\u3057\u305f\u30e6\u30fc\u30b6\u306b\u3064\u3044\u3066\u5225\u306e\u30a2\u30af\u30bb\u30b9\u30ad\u30fc\u3092\u767a\u884c\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3067\u3059<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2>2. Kubernetes \u30af\u30e9\u30b9\u30bf\u4e0a\u306b cert-manager \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h2>\n<p><a href=\"https:\/\/docs.cert-manager.io\/en\/latest\/getting-started\/install\/kubernetes.html#installing-with-helm\">\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/a>\u901a\u308a\u3001helm \u3092\u7528\u3044\u3066 cert-manager \u3092 Kubernetes \u30af\u30e9\u30b9\u30bf\u3078\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n<pre><code>$ helm install \n    --name cert-manager \n    --namespace kube-system \n    stable\/cert-manager<\/code><\/pre>\n<p>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u304c\u5b8c\u4e86\u3059\u308b\u3068\u3001\u4ee5\u4e0b\u306e\u69d8\u306b <code>kube-system<\/code> namespace \u306b <code>cert-manager<\/code> \u306e Pod \u304c\u52d5\u304d\u59cb\u3081\u307e\u3059\u3002<\/p>\n<pre><code>$ kubectl -n kube-system get pod\nNAME                                           READY     STATUS    RESTARTS   AGE\ncert-manager-cert-manager-56fcf79bc8-dx85q     1\/1       Running   0          39m<\/code><\/pre>\n<h2>3. \u8a3c\u660e\u66f8\u3092\u767a\u884c\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a\u3092\u884c\u3046<\/h2>\n<p>cert-manager \u3067\u306f\u3001\u8a3c\u660e\u66f8\u3092\u767a\u884c\u3059\u308b\u305f\u3081\u306e ACME \u30d7\u30ed\u30d1\u30a4\u30c0(Let\u2019s Encrypt)\u3084 DNS \u30d7\u30ed\u30d1\u30a4\u30c0\u306a\u3069\u306e\u8a2d\u5b9a\u3092 Issuer\/ClusterIssuer \u3068\u3044\u3046\u30ea\u30bd\u30fc\u30b9\u3067\u7ba1\u7406\u3057\u307e\u3059\u3002<\/p>\n<p>Issuer\/ClusterIssuer \u306f namespace \u6bce\u306b\u5229\u7528\u53ef\u80fd\u3068\u3059\u308b\u304b\u3001\u30af\u30e9\u30b9\u30bf\u5168\u4f53\u3067\u5229\u7528\u53ef\u80fd\u3068\u3059\u308b\u304b\u306e\u9055\u3044\u3067\u3001\u672c\u8a18\u4e8b\u3067\u306f\u30af\u30e9\u30b9\u30bf\u5168\u4f53\u3067\u5229\u7528\u3067\u304d\u308b\u3088\u3046\u306b ClusterIssuer \u3068\u3057\u3066\u767b\u9332\u3057\u307e\u3059\u3002<\/p>\n<ol>\n<li>\u307e\u305a\u3001IAM \u30e6\u30fc\u30b6\u30fc\u4f5c\u6210\u6642\u306b\u767a\u884c\u3057\u305f\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u30a2\u30af\u30bb\u30b9\u30ad\u30fc\u3092 Secret \u3068\u3057\u3066\u767b\u9332\u3057\u307e\u3059\n<pre><code>$ kubectl -n kube-system create secret generic prod-route53-credentials-secret --from-literal=secret-access-key=&lt;\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u30a2\u30af\u30bb\u30b9\u30ad\u30fc&gt;<\/code><\/pre>\n<\/li>\n<li>\u767b\u9332\u3067\u304d\u305f\u304b\u78ba\u8a8d\u3057\u307e\u3059\n<pre><code>$ kubectl -n kube-system get secret prod-route53-credentials-secret\nNAME                              TYPE      DATA      AGE\nprod-route53-credentials-secret   Opaque    1         59d<\/code><\/pre>\n<\/li>\n<li>DNS-01 \u3067\u30c9\u30e1\u30a4\u30f3\u3092\u691c\u8a3c\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b ClusterIssuer \u3092\u4f5c\u6210\u3057\u3001Kubernetes \u30af\u30e9\u30b9\u30bf\u4e0a\u306b\u767b\u9332\u3057\u307e\u3059\n<pre><code>$ cat &lt;&lt;&#039;EOF&#039;&gt; clusterissuer-letsencrypt.yaml\napiVersion: certmanager.k8s.io\nkind: ClusterIssuer\nmetadata:\nname: letsencrypt\nspec:\nacme:\nemail: &lt;\u4efb\u610f\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9&gt;\nserver: https:\/\/acme-staging-v02.api.letsencrypt.org\/directory\nprivateKeySecretRef:\n  name: letsencrypt-private-key\ndns01:\n  providers:\n  - name: route53\n    route53:\n      accessKeyID: &lt;\u30a2\u30af\u30bb\u30b9\u30ad\u30fcID&gt;\n      region: us-east-1\n      secretAccessKeySecretRef:\n        key: secret-access-key\n        name: prod-route53-credentials-secret\nEOF\n$ kubectl apply -f clusterissuer-letsencrypt.yaml<\/code><\/pre>\n<ul>\n<li><code>&lt;\u4efb\u610f\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9&gt;<\/code> \u306e\u90e8\u5206\u306f\u3001\u3054\u81ea\u8eab\u3067\u53d7\u4fe1\u3067\u304d\u308b\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u8a18\u8f09\u3057\u3066\u304f\u3060\u3055\u3044\n<ul>\n<li>\u767a\u884c\u3057\u305f\u8a3c\u660e\u66f8\u306e\u671f\u9650\u304c\u8fd1\u3065\u304f\u3068\u3001\u30e1\u30fc\u30eb\u3067\u901a\u77e5\u304c\u6765\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n<li>&lt;\u30a2\u30af\u30bb\u30b9\u30ad\u30fcID&gt;` \u306e\u90e8\u5206\u306f\u3001IAM \u30e6\u30fc\u30b6\u30fc\u4f5c\u6210\u6642\u306b\u767a\u884c\u3057\u305f\u30a2\u30af\u30bb\u30b9\u30ad\u30fcID\u3092\u8a18\u8f09\u3057\u3066\u304f\u3060\u3055\u3044<\/li>\n<\/ul>\n<\/li>\n<li>Let\u2019s Encrypt \u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u767a\u884c\u72b6\u6cc1\u3092\u78ba\u8a8d\u3057\u307e\u3059\n<pre><code>$ kubectl describe clusterissuer letsencrypt\n...(snip)...\nStatus:\nAcme:\nUri:  https:\/\/acme-v02.api.letsencrypt.org\/acme\/acct\/XXXXXXXX\nConditions:\nLast Transition Time:  2018-05-18T15:20:48Z\nMessage:               The ACME account was registered with the ACME server\nReason:                ACMEAccountRegistered\nStatus:                True\nType:                  Ready\nEvents:                    &lt;none&gt;<\/code><\/pre>\n<ul>\n<li>\u4e0a\u8a18\u306e\u3088\u3046\u306b\u3001Message \u304c <code>The ACME account was registered with the ACME server<\/code> \u3068\u306a\u3063\u3066\u3044\u308c\u3070\u3001Let\u2019s Encrypt \u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u6b63\u5e38\u306b\u4f5c\u6210\u3067\u304d\u3066\u3044\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2>4. \u8a3c\u660e\u66f8\u306e\u767a\u884c<\/h2>\n<p>\u3053\u3053\u307e\u3067\u6e96\u5099\u3067\u304d\u305f\u3089\u3001\u3044\u3088\u3044\u3088\u8a3c\u660e\u66f8\u3092\u767a\u884c\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>cert-manager \u3067\u306f\u3001\u767a\u884c\u3059\u308b\u8a3c\u660e\u66f8\u306e\u4e2d\u8eab\u3092\u5b9a\u7fa9\u3059\u308b\u8a2d\u5b9a\u3092 Certificate \u3068\u3044\u3046\u30ea\u30bd\u30fc\u30b9\u3067\u7ba1\u7406\u3057\u307e\u3059\u3002<\/p>\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001<code>*.example.com<\/code> \u306b\u95a2\u3059\u308b\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9\u8a3c\u660e\u66f8\u3092\u767a\u884c\u3059\u308b\u3001\u3068\u3044\u3046\u60f3\u5b9a\u3067\u8a2d\u5b9a\u3092\u8a18\u8f09\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<ol>\n<li>Certificate \u3092\u4f5c\u6210\u3057\u3001Kubernetes \u30af\u30e9\u30b9\u30bf\u4e0a\u306b\u767b\u9332\u3057\u307e\u3059\n<pre><code>$ cat &lt;&lt;&#039;EOF&#039;&gt; cert-wildcard-example.yaml\napiVersion: certmanager.k8s.io\/v1alpha1\nkind: Certificate\nmetadata:\n  name: wildcard-example\nspec:\n  acme:\n    config:\n    - dns01:\n        provider: route53\n      domains:\n      - &#039;*.example.com&#039;\n  commonName: &#039;*.example.com\n  issuerRef:\n    kind: ClusterIssuer\n    name: letsencrypt\n  secretName: cert-wildcard-example\nEOF\n$ kubectl apply -f cert-wildcard-example.yaml<\/code><\/pre>\n<ul>\n<li><code>kubectl apply<\/code> \u306b\u3088\u308b\u30ea\u30bd\u30fc\u30b9\u306e\u767b\u9332\u304c\u5b8c\u4e86\u3059\u308b\u3068\u3001cert-manager \u306b\u3088\u3063\u3066\u3059\u3050\u306b\u8a3c\u660e\u66f8\u767a\u884c\u4f5c\u696d\u304c\u958b\u59cb\u3055\u308c\u307e\u3059<\/li>\n<li>\u8a3c\u660e\u66f8\u767a\u884c\u304c\u5b8c\u4e86\u3059\u308b\u3068\u3001 <code>spec.secretName<\/code> \u306b\u8a2d\u5b9a\u3055\u308c\u305f Secret \u306b\u53d6\u5f97\u3057\u305f\u8a3c\u660e\u66f8\u306e\u5185\u5bb9\u304c\u51fa\u529b\u3055\u308c\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u8a3c\u660e\u66f8\u306e\u767a\u884c\u72b6\u6cc1\u3092\u78ba\u8a8d\u3057\u307e\u3059<\/p>\n<pre><code>$ kubectl describe cert wildcard-example\n...(snip)...\nStatus:\n  Acme:\n    Order:\n      URL:  https:\/\/acme-v02.api.letsencrypt.org\/acme\/order\/XXXXXXXX\/XXXXXXXX\n  Conditions:\n    Last Transition Time:  2018-06-18T03:26:11Z\n    Message:               Certificate renewed successfully\n    Reason:                CertRenewed\n    Status:                True\n    Type:                  Ready\n    Last Transition Time:  \n\n&lt;nil&gt;\n    Message:               Order validated\n    Reason:                OrderValidated\n    Status:                False\n    Type:                  ValidateFailed&lt;\/nil&gt;<\/code><\/pre>\n<ul>\n<li>DNS-01 \u306b\u3088\u308b\u30c9\u30e1\u30a4\u30f3\u691c\u8a3c\u306f DNS \u4f1d\u642c\u306b\u6642\u9593\u304c\u304b\u304b\u308b\u305f\u3081\u3001\u8a3c\u660e\u66f8\u767a\u884c\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u5c11\u3057\u5f85\u3064\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\n<ul>\n<li>DNS \u4f1d\u642c\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u5f85\u6a5f\u3059\u308b\u4f5c\u696d\u3082 cert-manager \u3067\u306f\u3084\u3063\u3066\u304f\u308c\u3066\u3044\u307e\u3059\uff01<\/li>\n<\/ul>\n<\/li>\n<li>\u8a3c\u660e\u66f8\u767a\u884c\u304c\u5b8c\u4e86\u3059\u308b\u3068\u3001\u4e0a\u8a18\u306e\u3088\u3046\u306b <code>Certificate renewed successfully<\/code> \u3068\u3044\u3046\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u78ba\u8a8d\u3067\u304d\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n<li>\u8a3c\u660e\u66f8\u304c\u51fa\u529b\u3055\u308c\u305f\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\n<pre><code>$ kubectl get secret cert-wildcard-example\nNAME                    TYPE                DATA      AGE\ncert-wildcard-example   kubernetes.io\/tls   2         25d<\/code><\/pre>\n<ul>\n<li>\u4e0a\u8a18\u306e\u3088\u3046\u306b <code>kubernetes.io\/tls<\/code> \u30bf\u30a4\u30d7\u306e Secret \u306e\u5b58\u5728\u304c\u78ba\u8a8d\u3067\u304d\u308c\u3070\u3001\u8a3c\u660e\u66f8\u306f\u767a\u884c\u3067\u304d\u3066\u3044\u307e\u3059\uff01<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2>5. Kubernetes \u30af\u30e9\u30b9\u30bf\u4e0a\u306b\u7acb\u3066\u305f Web \u30b5\u30fc\u30d3\u30b9\u306e\u516c\u958b<\/h2>\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001\u30b5\u30f3\u30d7\u30eb\u306e\u305f\u3081\u306e nginx Pod \u3092 Kubernetes \u30af\u30e9\u30b9\u30bf\u4e0a\u306b\u7acb\u3066\u3066\u3001\u305d\u308c\u3092\u5916\u90e8\u306b\u516c\u958b\u3059\u308b\u305f\u3081\u306e Service\/Ingress \u3092\u767b\u9332\u3057\u3066\u307f\u307e\u3059\u3002<br \/>\nIngress \u3067\u6307\u5b9a\u3059\u308b\u8a3c\u660e\u66f8\u306b\u3001\u4eca\u56de\u767a\u884c\u3057\u305f\u8a3c\u660e\u66f8\u3092\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<ol>\n<li>\u30b5\u30f3\u30d7\u30eb\u30a2\u30d7\u30ea\u3092\u7acb\u3061\u4e0a\u3052\u307e\u3059\n<pre><code>$ cat &lt;&lt;&#039;EOF&#039; &gt; example-nginx.yaml\napiVersion: extensions\/v1beta1\nkind: Deployment\nmetadata:\n  name: nginx-example-deployment\n  labels:\n    app: example-nginx\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: example-nginx\n    spec:\n      containers:\n      - name: nginx\n        image: nginx\n        ports:\n        - containerPort: 80\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: example-nginx\n  labels:\n    app: example-nginx\nspec:\n  ports:\n  - name: http\n    port: 80\n    protocol: TCP\n    targetPort: 80\n  selector:\n    app: example-nginx\n  type: NodePort\n---\napiVersion: extensions\/v1beta1\nkind: Ingress\nmetadata:\n  name: example-nginx\n  labels:\n    app: example-nginx\nspec:\n  rules:\n  - host: nginx.example.com\n    http:\n      paths:\n      - backend:\n          serviceName: example-nginx\n          servicePort: 80\n  tls:\n  - hosts:\n    - nginx.example.com\n    secretName: cert-wildcard-example\nEOF\n$ kubectl apply -f example-nginx.yaml<\/code><\/pre>\n<\/li>\n<li>Ingress \u3067\u53d6\u5f97\u3067\u304d\u305f\u30a2\u30c9\u30ec\u30b9\u3092\u78ba\u8a8d\u3057\u307e\u3059(\u4ee5\u4e0b\u306e\u300cADDRESS\u300d\u306e\u7b87\u6240)\n<pre><code>$ kubectl get ing\nNAME            HOSTS               ADDRESS                  PORTS     AGE\nexample-nginx   nginx.example.com   XXX.XXX.XXX.XXX          80, 443   3m<\/code><\/pre>\n<ul>\n<li>\u3053\u306e\u30a2\u30c9\u30ec\u30b9\u306b\u5bfe\u3057\u3066\u540d\u524d\u304c\u5f15\u3051\u308b\u3088\u3046\u306b DNS \u3092\u8a2d\u5b9a\u3057\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2>6. AWS Route 53 \u306e\u8a2d\u5b9a<\/h2>\n<p><a href=\"https:\/\/console.aws.amazon.com\/route53\/home\">AWS Route53<\/a> \u3078\u30a2\u30af\u30bb\u30b9\u3057\u3001\u4e0a\u8a18\u306e\u30a2\u30c9\u30ec\u30b9\u306b\u5bfe\u3057\u3066 <code>nginx.example.com<\/code> \u3067\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3088\u3046\u306b A \u30ec\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<h2>7. Let\u2019s \u30a2\u30af\u30bb\u30b9!!<\/h2>\n<p><a href=\"https:\/\/nginx.example.com\">https:\/\/nginx.example.com<\/a> \u3078\u30a2\u30af\u30bb\u30b9\u3057\u3066\u3001\u4ee5\u4e0b\u306e\u69d8\u306b\u767a\u884c\u3055\u308c\u305f\u8a3c\u660e\u66f8\u304c\u30d6\u30e9\u30a6\u30b6\u4e0a\u3067\u78ba\u8a8d\u3067\u304d\u308c\u3070\u3001\u8a3c\u660e\u66f8\u767a\u884c\u57fa\u76e4\u306e\u69cb\u7bc9\u306f\u5b8c\u4e86\u3067\u3059\uff01<img src=\"https:\/\/weseek.co.jp\/tech\/wp-content\/uploads\/2021\/06\/20190912125006.png\" alt=\"\" \/><\/p>\n<ul>\n<li>\u6ce8: example.com \u306e\u30c9\u30e1\u30a4\u30f3\u306f\u6240\u6709\u3067\u304d\u306a\u3044\u3082\u306e\u306a\u306e\u3067\u3001\u3053\u306e\u753b\u50cf\u306f\u5408\u6210\u3067\u3059<\/li>\n<\/ul>\n<p>\u30b5\u30f3\u30d7\u30eb\u3067\u5229\u7528\u3057\u305f\u30b5\u30fc\u30d3\u30b9\u306e\u8a2d\u5b9a\u306f\u4ee5\u4e0b\u3067\u5168\u90e8\u524a\u9664\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre><code>$ kubectl delete deploy,svc,ing -l &#039;app=example-nginx&#039;<\/code><\/pre>\n<h1>\u305d\u306e\u4ed6\u306e\u30c9\u30e1\u30a4\u30f3\u691c\u8a3c\u65b9\u6cd5<\/h1>\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9\u8a3c\u660e\u66f8\u3092\u767a\u884c\u3059\u308b\u305f\u3081\u306b\u5fc5\u8981\u306a DNS-01 \u65b9\u5f0f\u306e\u30c9\u30e1\u30a4\u30f3\u691c\u8a3c\u3092\u3059\u308b\u8a2d\u5b9a\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u304c\u3001cert-manager \u3067\u306f DNS-01 \u65b9\u5f0f\u4ee5\u5916\u306b\u3082 HTTP-01 \u65b9\u5f0f\u3067\u306e\u30c9\u30e1\u30a4\u30f3\u691c\u8a3c\u306b\u3082\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u8a73\u3057\u304f\u306f\u3001<a href=\"https:\/\/cert-manager.readthedocs.io\/en\/latest\/\">cert-manager \u306e\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/a>\u3082\u3054\u89a7\u304f\u3060\u3055\u3044\u3002<\/p>\n<h1>\u307e\u3068\u3081<\/h1>\n<p>\u3044\u304b\u304c\u3067\u3057\u305f\u3067\u3057\u3087\u3046\u304b\u3002\u672c\u8a18\u4e8b\u3067\u7d39\u4ecb\u3057\u305f\u57fa\u76e4\u3092 Kubernetes \u30af\u30e9\u30b9\u30bf\u4e0a\u306b\u7528\u610f\u3057\u3066\u304a\u304f\u3053\u3068\u3067\u3001\u30c7\u30e2\u74b0\u5883\u3092\u3088\u308a\u305f\u304f\u3055\u3093\u3001\u5b89\u5168\u306b\u7528\u610f\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u662f\u975e\u3001CI\/CD \u3068\u4f75\u305b\u3066\u7686\u3055\u3093\u306e\u958b\u767a\u74b0\u5883\u306b\u53d6\u308a\u5165\u308c\u3066\u3044\u305f\u3060\u304d\u3001\u672c\u8a18\u4e8b\u304c\u958b\u767a\u30fb\u30ea\u30ea\u30fc\u30b9\u901f\u5ea6\u3092\u5411\u4e0a\u3055\u305b\u308b\u4e0a\u3067\u53c2\u8003\u306b\u306a\u308c\u3070\u5e78\u3044\u3067\u3059\u3002<\/p>\n<h3>\u95a2\u9023\u8a18\u4e8b<\/h3>\n<p><a href=\"https:\/\/weseek.co.jp\/tech\/285\/\">WESEEK\u3067\u63a1\u7528\u3057\u3066\u3044\u308b CI\/CD \u5b9f\u73fe\u624b\u6cd5<\/a><\/p>\n<p><a href=\"https:\/\/weseek.co.jp\/tech\/400\/\">\u30b7\u30b9\u30c6\u30e0\u958b\u767a\u306b\u304a\u3051\u308b\u30c6\u30b9\u30c8\u306e\u6982\u8981\u3084\u6982\u5ff5 | |\u7b2c2\u8a71<\/a><\/p>\n<p><a href=\"https:\/\/weseek.co.jp\/tech\/398\/\">\u30b7\u30b9\u30c6\u30e0\u958b\u767a\u306b\u304a\u3051\u308b\u30c6\u30b9\u30c8\u306e\u6982\u8981\u3084\u6982\u5ff5 |\u7b2c1\u8a71<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u306f\u3058\u3081\u306b SEROKU \u306e\u958b\u767a\u30d5\u30ed\u30fc\u3067\u306f\u3001\u958b\u767a\u7528\u306e\u30ea\u30dd\u30b8\u30c8\u30ea\u306b Mercurial \u3092\u7528\u3044\u3001\u5404\u6a5f\u80fd\u5b9f\u88c5\u3054\u3068\u306b\u30d6\u30e9\u30f3\u30c1\u3092\u7528\u610f\u3057\u305f\u4e0a\u3067\u958b\u767a\u3092\u884c\u3063\u3066\u3044\u307e\u3059\u3002 \u305d\u306e\u4e0a\u3067\u3055\u3089\u306b\u3001\u793e\u5185\u306b Kubernetes \u30af\u30e9\u30b9\u30bf\u3092\u7528\u610f\u3057\u3066\u3001\u30d6<\/p>\n","protected":false},"author":3,"featured_media":456,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[198,16],"tags":[],"_links":{"self":[{"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/posts\/455"}],"collection":[{"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/comments?post=455"}],"version-history":[{"count":20,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/posts\/455\/revisions"}],"predecessor-version":[{"id":4082,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/posts\/455\/revisions\/4082"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/media\/456"}],"wp:attachment":[{"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/media?parent=455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/categories?post=455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/tags?post=455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}