์ข์ ์คํ ์น๊ตฌ. ์๋ก์ด ํ๋ฆ์ ์์์ ๊ธฐ๋ํ๋ฉฐ
์ธํ๋ผ ์ฝ๋(์ฝ๋๋ก์์ ์ธํ๋ผ)์ Pulumi ๋ฐ ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์ ๋ฐ ์ง์์ ๊ฐ์ฉ์ฑ, ์ถ์ํ๋ฅผ ํตํ ์ฝ๋์ ์์ฉ๊ตฌ ์ ๊ฑฐ, IDE ๋ฐ ๋ฆฐํฐ์ ๊ฐ์ด ํ์ ์น์ํ ๋๊ตฌ ๋ฑ ๋ง์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ชจ๋ ์ํํธ์จ์ด ์์ง๋์ด๋ง ๋๊ตฌ๋ ์์ฐ์ฑ์ ๋์ผ ๋ฟ๋ง ์๋๋ผ ์ฝ๋ ํ์ง๋ ํฅ์์ํต๋๋ค. ๋ฐ๋ผ์ ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋ค๋ฅธ ์ค์ํ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐฉ์์ ๋์
ํ ์ ์๋ค๋ ๊ฒ์ ๋น์ฐํฉ๋๋ค. ํ
์คํธ.
์ด ๊ธฐ์ฌ์์๋ Pulumi๊ฐ ์ฝ๋ํ ์ธํ๋ผ ํ ์คํธ์ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ธํ๋ผ๋ฅผ ํ ์คํธํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์์ธํ ์ค๋ช ํ๊ธฐ ์ ์ "์ธํ๋ผ๋ฅผ ํ ์คํธํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?"๋ผ๋ ์ง๋ฌธ์ ๋์ ธ ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๊ฐ ์์ผ๋ฉฐ ๊ทธ ์ค ์ผ๋ถ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฐ๋ณ ๊ธฐ๋ฅ ๋๋ ํ๋ก๊ทธ๋จ ๋ก์ง์ ๋จํธ์ ๋ํ ๋จ์ ํ ์คํธ
- ํน์ ์ ์ฝ ์กฐ๊ฑด์ ๋ํด ์ํ๋ ์ธํ๋ผ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
- ์คํ ๋ฆฌ์ง ๋ฒํท์ ์ํธํ ๋ถ์กฑ ๋๋ ์ธํฐ๋ท์์ ๊ฐ์ ๋จธ์ ์ผ๋ก์ ๋ณดํธ๋์ง ์์ ๊ฐ๋ฐฉํ ์ก์ธ์ค์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ฅผ ๊ฐ์งํฉ๋๋ค.
- ์ธํ๋ผ ํ๋ก๋น์ ๋ ๊ตฌํ์ ํ์ธํฉ๋๋ค.
- ํ๋ก๋น์ ๋ ํ ๊ธฐ๋ฅ์ ํ์ธํ๊ธฐ ์ํด "ํ๋ก๊ทธ๋๋ฐ๋" ์ธํ๋ผ ๋ด์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ๋ฐํ์ ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค.
- ๋ณด์๋ค์ํผ ๊ด๋ฒ์ํ ์ธํ๋ผ ํ ์คํธ ์ต์ ์ด ์์ต๋๋ค. Polumi๋ ์ด ์คํํธ๋ผ์ ๋ชจ๋ ์ง์ ์์ ํ ์คํธํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค. ์์ํ์ฌ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จ์ ํ ์คํธ
Pulumi ํ๋ก๊ทธ๋จ์ JavaScript, Python, TypeScript ๋๋ Go์ ๊ฐ์ ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ํฌํจํ ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ์ฌ ์ด๋ฌํ ์ธ์ด์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. Pulumi๋ ๋ฉํฐ ํด๋ผ์ฐ๋์ด๋ฏ๋ก ๋ชจ๋ ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด์ ํ ์คํธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
(์ด ๊ธฐ์ฌ์์๋ ๋ค๊ตญ์ด, ๋ฉํฐํด๋ผ์ฐ๋์์๋ ๋ถ๊ตฌํ๊ณ JavaScript์ Mocha๋ฅผ ์ฌ์ฉํ๊ณ AWS์ ์ค์ ์ ๋ก๋๋ค. Python์ ์ฌ์ฉํ ์ ์์ต๋๋ค. unittest
, ํ
์คํธ ํ๋ ์์ํฌ ๋๋ ์ํ๋ ๋ค๋ฅธ ํ
์คํธ ํ๋ ์์ํฌ๋ก ์ด๋ํ์ธ์. ๋ฌผ๋ก Pulumi๋ Azure, Google Cloud, Kubernetes์๋ ์ ์๋ํฉ๋๋ค.)
์ง๊ธ๊น์ง ์ดํด๋ณด์๋ฏ์ด ์ธํ๋ผ ์ฝ๋๋ฅผ ํ
์คํธํ๋ ค๋ ๋ฐ์๋ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค. ๊ทธ ์ค ํ๋๊ฐ ๊ธฐ์กด ๋จ์ ํ
์คํธ์
๋๋ค. ์ฝ๋์ CIDR ๊ณ์ฐ, ์ด๋ฆ, ํ๊ทธ ๋ฑ์ ๋์ ์ธ ๊ณ์ฐ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. - ์๋ง ํ
์คํธํด๋ณด๊ณ ์ถ์ ๊ฒ๋๋ค. ์ด๋ ์ ํธํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํ ์ผ๋ฐ ๋จ์ ํ
์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ข ๋ ๋ณต์กํด์ง๊ธฐ ์ํด ํ๋ก๊ทธ๋จ์ด ๋ฆฌ์์ค๋ฅผ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ค๋ช
์ ์ํด ๊ฐ๋จํ EC2 ์๋ฒ๋ฅผ ์์ฑํด์ผ ํ๋ฉฐ ๋ค์ ์ฌํญ์ ํ์ธํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
- ์ธ์คํด์ค์๋ ํ๊ทธ๊ฐ ์์ต๋๋ค
Name
. - ์ธ์คํด์ค๋ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ฉ๋๋ค.
userData
- AMI(์ด๋ฏธ์ง)๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. - ์ธํฐ๋ท์ SSH๊ฐ ๋ ธ์ถ๋์ด์๋ ์ ๋ฉ๋๋ค.
์ด ์๋ ๋ค์์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
index.js:
"use strict";
let aws = require("@pulumi/aws");
let group = new aws.ec2.SecurityGroup("web-secgrp", {
ingress: [
{ protocol: "tcp", fromPort: 22, toPort: 22, cidrBlocks: ["0.0.0.0/0"] },
{ protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] },
],
});
let userData =
`#!/bin/bash
echo "Hello, World!" > index.html
nohup python -m SimpleHTTPServer 80 &`;
let server = new aws.ec2.Instance("web-server-www", {
instanceType: "t2.micro",
securityGroups: [ group.name ], // reference the group object above
ami: "ami-c55673a0" // AMI for us-east-2 (Ohio),
userData: userData // start a simple web server
});
exports.group = group;
exports.server = server;
exports.publicIp = server.publicIp;
exports.publicHostName = server.publicDns;
์ด๊ฒ์ด ๊ธฐ๋ณธ Pulumi ํ๋ก๊ทธ๋จ์ ๋๋ค. ๊ฐ๋จํ EC2 ๋ณด์ ๊ทธ๋ฃน๊ณผ ์ธ์คํด์ค๋ฅผ ํ ๋นํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ์์์ ์ธ๊ธํ ์ธ ๊ฐ์ง ๊ท์น์ ๋ชจ๋ ์๋ฐํ๊ณ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ํ ์คํธ๋ฅผ ์์ฑํด๋ณด์!
ํ ์คํธ ์์ฑ
ํ ์คํธ์ ์ผ๋ฐ์ ์ธ ๊ตฌ์กฐ๋ ์ผ๋ฐ Mocha ํ ์คํธ์ ์ ์ฌํฉ๋๋ค.
ec2tests.js
test.js:
let assert = require("assert");
let mocha = require("mocha");
let pulumi = require("@pulumi/pulumi");
let infra = require("./index");
describe("Infrastructure", function() {
let server = infra.server;
describe("#server", function() {
// TODO(check 1): ะะพะปะถะตะฝ ะฑััั ััะณ Name.
// TODO(check 2): ะะต ะดะพะปะถะฝะพ ะฑััั inline-ัะบัะธะฟัะฐ userData.
});
let group = infra.group;
describe("#group", function() {
// TODO(check 3): ะะต ะดะพะปะถะฝะพ ะฑััั SSH, ะพัะบัััะพะณะพ ะฒ ะะฝัะตัะฝะตั.
});
});
์ด์ ์ฒซ ๋ฒ์งธ ํ
์คํธ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ์ธ์คํด์ค์ ํ๊ทธ๊ฐ ์๋์ง ํ์ธํ์ธ์. Name
. ์ด๋ฅผ ํ์ธํ๋ ค๋ฉด EC2 ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์์ ํด๋น ์์ฑ์ ํ์ธํ๋ฉด ๋ฉ๋๋ค. tags
:
// check 1: ะะพะปะถะตะฝ ะฑััั ััะณ Name.
it("must have a name tag", function(done) {
pulumi.all([server.urn, server.tags]).apply(([urn, tags]) => {
if (!tags || !tags["Name"]) {
done(new Error(`Missing a name tag on server ${urn}`));
} else {
done();
}
});
});
์ผ๋ฐ์ ์ธ ํ ์คํธ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฃผ๋ชฉํ ๋งํ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
- ๋ฐฐํฌํ๊ธฐ ์ ์ ๋ฆฌ์์ค ์ํ๋ฅผ ์ฟผ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ๋ ํญ์ "๊ณํ"(๋๋ "๋ฏธ๋ฆฌ ๋ณด๊ธฐ") ๋ชจ๋์์ ์คํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ด ๊ฒ์๋์ง ์๊ฑฐ๋ ์ ์๋์ง ์๋ ์์ฑ์ด ๋ง์ด ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ํด๋ผ์ฐ๋ ๊ณต๊ธ์๊ฐ ๊ณ์ฐํ ๋ชจ๋ ์ถ๋ ฅ ์์ฑ์ด ํฌํจ๋ฉ๋๋ค. ์ด๋ ํ ์คํธ์์๋ ์ ์์ ์ธ ํ์์ ๋๋ค. ์ ๋ ฅ ๋ฐ์ดํฐ๋ง ํ์ธํฉ๋๋ค. ๋์ค์ ํตํฉ ํ ์คํธ์ ๊ดํด ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
- ๋ชจ๋ Pulumi ๋ฆฌ์์ค ์์ฑ์ ์ถ๋ ฅ์ด๊ณ ๊ทธ ์ค ๋ง์ ์์ฑ์ด ๋น๋๊ธฐ์์ผ๋ก ํ๊ฐ๋๋ฏ๋ก ๊ฐ์ ์ก์ธ์คํ๋ ค๋ฉด ์ ์ฉ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๋ Promise ๋ฐ afunction๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
then
. - ์ค๋ฅ ๋ฉ์์ง์ ๋ฆฌ์์ค URN์ ํ์ํ๊ธฐ ์ํด ์ฌ๋ฌ ์์ฑ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ๋ค์ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
pulumi.all
๊ทธ๋ค์ ๊ฒฐํฉํฉ๋๋ค. - ๋ง์ง๋ง์ผ๋ก ์ด๋ฌํ ๊ฐ์ ๋น๋๊ธฐ์ ์ผ๋ก ๊ณ์ฐ๋๋ฏ๋ก Mocha์ ๋ด์ฅ๋ ๋น๋๊ธฐ ์ฝ๋ฐฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
done
๋๋ ์ฝ์์ ๋ฐํํฉ๋๋ค.
๋ชจ๋ ์ค์ ์ด ์๋ฃ๋๋ฉด ๊ฐ๋จํ JavaScript ๊ฐ์ผ๋ก ์
๋ ฅ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ฌ์ฐ tags
๋ ๋งต(์ฐ๊ด ๋ฐฐ์ด)์ด๋ฏ๋ก (1) false๊ฐ ์๋์ง, (2) ๋ค์์ ๋ํ ํค๊ฐ ์๋์ง ํ์ธํ๊ฒ ์ต๋๋ค. Name
. ๋งค์ฐ ๊ฐ๋จํ๋ฏ๋ก ์ด์ ๋ฌด์์ด๋ ํ
์คํธํ ์ ์์ต๋๋ค!
์ด์ ๋ ๋ฒ์งธ ์ํ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ํจ์ฌ ๋ ๊ฐ๋จํฉ๋๋ค.
// check 2: ะะต ะดะพะปะถะฝะพ ะฑััั inline-ัะบัะธะฟัะฐ userData.
it("must not use userData (use an AMI instead)", function(done) {
pulumi.all([server.urn, server.userData]).apply(([urn, userData]) => {
if (userData) {
done(new Error(`Illegal use of userData on server ${urn}`));
} else {
done();
}
});
});
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์ธ ๋ฒ์งธ ํ ์คํธ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ๋ณด์ ๊ทธ๋ฃน๊ณผ ๊ด๋ จ๋ ๋ก๊ทธ์ธ ๊ท์น(๋ง์ ์ ์์)๊ณผ ํด๋น ๊ท์น์ CIDR ๋ฒ์(๋ง์ ์๋ ์์)๋ฅผ ์ฐพ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ์ข ๋ ๋ณต์กํฉ๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ๋ค์์ ์ํํ์ต๋๋ค.
// check 3: ะะต ะดะพะปะถะฝะพ ะฑััั SSH, ะพัะบัััะพะณะพ ะฒ ะะฝัะตัะฝะตั.
it("must not open port 22 (SSH) to the Internet", function(done) {
pulumi.all([ group.urn, group.ingress ]).apply(([ urn, ingress ]) => {
if (ingress.find(rule =>
rule.fromPort == 22 && rule.cidrBlocks.find(block =>
block === "0.0.0.0/0"))) {
done(new Error(`Illegal SSH port 22 open to the Internet (CIDR 0.0.0.0/0) on group ${urn}`));
} else {
done();
}
});
});
๊ทธ๊ฒ ๋ค์ผ. ์ด์ ํ ์คํธ๋ฅผ ์คํํด๋ณด๊ฒ ์ต๋๋ค!
ํ ์คํธ ์คํ
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ ํํ ํ
์คํธ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ํ
์คํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ํ๋ฃจ๋ฏธ์๋ ์ฃผ๋ชฉํ ๋งํ ํน์ง์ด ํ๋ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก Pulumi ํ๋ก๊ทธ๋จ์ ์คํํ๋ ค๋ฉด ์ธ์ด ๋ฐํ์์ ๊ตฌ์ฑํ๊ณ Pulumi ์์ง ์คํ์ ์ ์ดํ์ฌ ๋ฆฌ์์ค ๊ด๋ จ ์์
์ ๊ธฐ๋กํ๊ณ ๊ณํ์ ํฌํจ์ํค๋ pulimi CLI(Command Line Interface)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํ
์คํธ ํ๋ ์์ํฌ์ ์ ์ด ํ์ ์คํ๋๋ ๊ฒฝ์ฐ CLI์ Pulumi ์์ง ๊ฐ์๋ ํต์ ์ด ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ค์ ์ฌํญ์ ์ง์ ํ๋ฉด ๋ฉ๋๋ค.
- ํ๊ฒฝ ๋ณ์์ ํฌํจ๋ ํ๋ก์ ํธ ์ด๋ฆ
PULUMI_NODEJS_PROJECT
(๋๋ ๋ ์ผ๋ฐ์ ์ผ๋ก,PULUMI__PROJECT ะดะปั ะดััะณะธั ัะทัะบะพะฒ).
ํ๊ฒฝ ๋ณ์์ ์ง์ ๋ ์คํ์ ์ด๋ฆPULUMI_NODEJS_STACK
(๋๋ ๋ ์ผ๋ฐ์ ์ผ๋ก,PULUMI__ STACK).
์คํ ๊ตฌ์ฑ ๋ณ์. ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ป์ ์ ์์ต๋๋ค.PULUMI_CONFIG
ํด๋น ํ์์ ํค/๊ฐ ์์ด ์๋ JSON ๋งต์ ๋๋ค.ํ๋ก๊ทธ๋จ์ ์คํ ์ค์ CLI/์์ง์ ๋ํ ์ฐ๊ฒฐ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒฝ๊ณ ๋ฅผ ํ์ํฉ๋๋ค. ์ด๋ ํ๋ก๊ทธ๋จ์ด ์ค์ ๋ก ์๋ฌด๊ฒ๋ ๋ฐฐํฌํ์ง ์๊ณ ์๋ํ ๋๋ก ๋ฐฐํฌ๋์ง ์์ผ๋ฉด ๋๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ํฉ๋๋ค! Pulumi์๊ฒ ์ด๊ฒ์ด ์ ํํ ํ์ํ ๊ฒ์์ ์๋ฆฌ๋ ค๋ฉด ๋ค์์ ์ค์นํ์ญ์์ค.
PULUMI_TEST_MODE
ะฒtrue
.ํ๋ก์ ํธ ์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ค๊ณ ์์ํด ๋ณด์ธ์.
my-ws
, ์คํ ์ด๋ฆdev
๋ฐ AWS ๋ฆฌ์ us-west-2
. Mocha ํ ์คํธ๋ฅผ ์คํํ๊ธฐ ์ํ ๋ช ๋ น์ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.$ PULUMI_TEST_MODE=true PULUMI_NODEJS_STACK="my-ws" PULUMI_NODEJS_PROJECT="dev" PULUMI_CONFIG='{ "aws:region": "us-west-2" }' mocha tests.js
์์๋๋ก ์ด๋ ๊ฒ ํ๋ฉด ์ธ ๊ฐ์ง ํ ์คํธ์ ์คํจํ์์ ์ ์ ์์ต๋๋ค!
Infrastructure #server 1) must have a name tag 2) must not use userData (use an AMI instead) #group 3) must not open port 22 (SSH) to the Internet 0 passing (17ms) 3 failing 1) Infrastructure #server must have a name tag: Error: Missing a name tag on server urn:pulumi:my-ws::my-dev::aws:ec2/instance:Instance::web-server-www 2) Infrastructure #server must not use userData (use an AMI instead): Error: Illegal use of userData on server urn:pulumi:my-ws::my-dev::aws:ec2/instance:Instance::web-server-www 3) Infrastructure #group must not open port 22 (SSH) to the Internet: Error: Illegal SSH port 22 open to the Internet (CIDR 0.0.0.0/0) on group
ํ๋ก๊ทธ๋จ์ ์์ ํด ๋ด ์๋ค:
"use strict"; let aws = require("@pulumi/aws"); let group = new aws.ec2.SecurityGroup("web-secgrp", { ingress: [ { protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] }, ], }); let server = new aws.ec2.Instance("web-server-www", { tags: { "Name": "web-server-www" }, instanceType: "t2.micro", securityGroups: [ group.name ], // reference the group object above ami: "ami-c55673a0" // AMI for us-east-2 (Ohio), }); exports.group = group; exports.server = server; exports.publicIp = server.publicIp; exports.publicHostName = server.publicDns;
๊ทธ๋ฐ ๋ค์ ํ ์คํธ๋ฅผ ๋ค์ ์คํํฉ๋๋ค.
Infrastructure #server โ must have a name tag โ must not use userData (use an AMI instead) #group โ must not open port 22 (SSH) to the Internet 3 passing (16ms)
๋ชจ๋ ์ผ์ด ์์กฐ๋กญ๊ฒ ์งํ๋์์ต๋๋ค... ๋ง์ธ! โโโ
์ค๋์ ์ฌ๊ธฐ๊น์ง์ ๋๋ค. ๋ฒ์ญ์ ๋ ๋ฒ์งธ ๋ถ๋ถ์์ ๋ฐฐํฌ ํ ์คํธ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค ๐
์ถ์ฒ : habr.com