āĻĒā§āĻ˛ā§āĻŽāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•ā§‹āĻĄ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻĒāĻ°āĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨āĨ¤ āĻ…āĻ‚āĻļ 1

āĻļā§āĻ­ āĻŦāĻŋāĻ•āĻžāĻ˛ āĻŦāĻ¨ā§āĻ§ā§āĻ°āĻž. āĻšāĻžāĻ°ā§‡ āĻ¨āĻ¤ā§āĻ¨ āĻĒā§āĻ°āĻŦāĻžāĻš āĻļā§āĻ°ā§ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻļāĻžāĻ¯āĻŧ "DevOps āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ āĻāĻŦāĻ‚ āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽ" āĻ†āĻŽāĻ°āĻž āĻ†āĻĒāĻ¨āĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻļā§‡āĻ¯āĻŧāĻžāĻ° āĻ•āĻ°āĻ›āĻŋāĨ¤ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž.

āĻĒā§āĻ˛ā§āĻŽāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•ā§‹āĻĄ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻĒāĻ°āĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨āĨ¤ āĻ…āĻ‚āĻļ 1

āĻĒāĻ°āĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ•ā§‹āĻĄā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ˛ā§āĻŽāĻŋ āĻāĻŦāĻ‚ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ-āĻ‰āĻĻā§āĻĻā§‡āĻļā§āĻ¯ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻ­āĻžāĻˇāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž (āĻ•ā§‹āĻĄ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ…āĻŦāĻ•āĻžāĻ āĻžāĻŽā§‹) āĻ…āĻ¨ā§‡āĻ• āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡: āĻĻāĻ•ā§āĻˇāĻ¤āĻž āĻāĻŦāĻ‚ āĻœā§āĻžāĻžāĻ¨ā§‡āĻ° āĻĒā§āĻ°āĻžāĻĒā§āĻ¯āĻ¤āĻž, āĻŦāĻŋāĻŽā§‚āĻ°ā§āĻ¤āĻ•āĻ°āĻŖā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ•ā§‹āĻĄā§‡ āĻŦāĻ¯āĻŧāĻ˛āĻžāĻ°āĻĒā§āĻ˛ā§‡āĻŸ āĻ¨āĻŋāĻ°ā§āĻŽā§‚āĻ˛ āĻ•āĻ°āĻž, āĻ†āĻĒāĻ¨āĻžāĻ° āĻĻāĻ˛ā§‡āĻ° āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻŸā§āĻ˛, āĻ¯ā§‡āĻŽāĻ¨ IDEs āĻāĻŦāĻ‚ āĻ˛āĻŋāĻ¨ā§āĻŸāĻžāĻ°āĨ¤ āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸āĻĢā§āĻŸāĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻ‡āĻžā§āĻœāĻŋāĻ¨āĻŋāĻ¯āĻŧāĻžāĻ°āĻŋāĻ‚ āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽāĻ—ā§āĻ˛āĻŋ āĻ•ā§‡āĻŦāĻ˛ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ†āĻ°āĻ“ āĻ‰āĻ¤ā§āĻĒāĻžāĻĻāĻ¨āĻļā§€āĻ˛ āĻ•āĻ°ā§‡ āĻ¨āĻž, āĻ¤āĻŦā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§‹āĻĄā§‡āĻ° āĻ—ā§āĻŖāĻŽāĻžāĻ¨āĻ“ āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻ•āĻ°ā§‡ā§ˇ āĻ…āĻ¤āĻāĻŦ, āĻāĻŸāĻž āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻ¯ā§‡ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ-āĻ‰āĻĻā§āĻĻā§‡āĻļā§āĻ¯ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻ­āĻžāĻˇāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ†āĻ°ā§‡āĻ•āĻŸāĻŋ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ¸āĻĢā§āĻŸāĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻ‰āĻ¨ā§āĻ¨āĻ¯āĻŧāĻ¨ āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ āĻĒā§āĻ°āĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ- āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻŽā§‚āĻ˛āĻ•.

āĻāĻ‡ āĻĒā§āĻ°āĻŦāĻ¨ā§āĻ§ā§‡, āĻ†āĻŽāĻ°āĻž āĻĻā§‡āĻ–āĻŦ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻĒā§āĻ˛ā§āĻŽāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒāĻ°āĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹-āĻ•ā§‹āĻĄ-āĻāĻ° āĻŽāĻ¤ā§‹ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°ā§‡āĨ¤

āĻĒā§āĻ˛ā§āĻŽāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•ā§‹āĻĄ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻĒāĻ°āĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨āĨ¤ āĻ…āĻ‚āĻļ 1

āĻ•ā§‡āĻ¨ āĻĒāĻ°āĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž?

āĻŦāĻŋāĻļāĻĻā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻ†āĻ—ā§‡, āĻĒā§āĻ°āĻļā§āĻ¨āĻŸāĻŋ āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°āĻž āĻŽā§‚āĻ˛ā§āĻ¯āĻŦāĻžāĻ¨: "āĻ•ā§‡āĻ¨ āĻĒāĻ°āĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ?" āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻ•āĻžāĻ°āĻŖ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻāĻ–āĻžāĻ¨ā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡:

  • āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ˛āĻœāĻŋāĻ•ā§‡āĻ° āĻĒā§ƒāĻĨāĻ• āĻĢāĻžāĻ‚āĻļāĻ¨ āĻŦāĻž āĻ–āĻŖā§āĻĄāĻ—ā§āĻ˛āĻŋāĻ° āĻ‡āĻ‰āĻ¨āĻŋāĻŸ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž
  • āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻžāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻ…āĻŦāĻ•āĻžāĻ āĻžāĻŽā§‹āĻ° āĻĒāĻ›āĻ¨ā§āĻĻāĻ¸āĻ‡ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°ā§‡āĨ¤
  • āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ° āĻ¸āĻ¨āĻžāĻ•ā§āĻ¤āĻ•āĻ°āĻŖ, āĻ¯ā§‡āĻŽāĻ¨ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻŦāĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻāĻ¨āĻ•ā§āĻ°āĻŋāĻĒāĻļāĻ¨ā§‡āĻ° āĻ…āĻ­āĻžāĻŦ āĻŦāĻž āĻ…āĻ°āĻ•ā§āĻˇāĻŋāĻ¤, āĻ­āĻžāĻ°ā§āĻšā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸ āĻĨā§‡āĻ•ā§‡ āĻ–ā§‹āĻ˛āĻž āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸āĨ¤
  • āĻĒāĻ°āĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻŦāĻŋāĻ§āĻžāĻ¨ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž.
  • āĻŦāĻŋāĻ§āĻžāĻ¨ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ° "āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ•āĻ°āĻž" āĻĒāĻ°āĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹āĻ° āĻ­āĻŋāĻ¤āĻ°ā§‡ āĻšāĻ˛āĻŽāĻžāĻ¨ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ˛āĻœāĻŋāĻ•ā§‡āĻ° āĻ°āĻžāĻ¨āĻŸāĻžāĻ‡āĻŽ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĨ¤
  • āĻ†āĻŽāĻ°āĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻšā§āĻ›āĻŋ, āĻĒāĻ°āĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻŦāĻŋāĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻŦāĻŋāĻ¸ā§āĻ¤ā§ƒāĻ¤ āĻĒāĻ°āĻŋāĻ¸āĻ° āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻĒāĻ˛ā§āĻŽāĻŋāĻ° āĻāĻ‡ āĻ¸ā§āĻĒā§‡āĻ•āĻŸā§āĻ°āĻžāĻŽā§‡āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻļā§āĻ°ā§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ• āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻĻā§‡āĻ–ā§āĻ¨.

āĻ…āĻ‚āĻļ āĻĒāĻ°āĻŋāĻ•ā§āĻˇāĻžāĻ•āĻ°āĻŖ

āĻĒā§āĻ˛ā§āĻŽāĻŋ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻ—ā§āĻ˛āĻŋ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ, āĻĒāĻžāĻ‡āĻĨāĻ¨, āĻŸāĻžāĻ‡āĻĒāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻŦāĻž āĻ—ā§‹-āĻāĻ° āĻŽāĻ¤ā§‹ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ-āĻ‰āĻĻā§āĻĻā§‡āĻļā§āĻ¯ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻ˛ā§‡āĻ–āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ…āĻ¤āĻāĻŦ, āĻāĻ‡ āĻ­āĻžāĻˇāĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•ā§āĻˇāĻŽāĻ¤āĻž, āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽ āĻāĻŦāĻ‚ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻ¸āĻš, āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ¸āĻš, āĻ¤āĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§āĨ¤ āĻĒā§āĻ˛ā§āĻŽāĻŋ āĻšāĻ˛ āĻŽāĻžāĻ˛ā§āĻŸāĻŋ-āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ, āĻ¯āĻžāĻ° āĻŽāĻžāĻ¨ā§‡ āĻāĻŸāĻŋ āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻĒā§āĻ°āĻĻāĻžāĻ¨āĻ•āĻžāĻ°ā§€āĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

(āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡, āĻŦāĻšā§āĻ­āĻžāĻˇāĻŋāĻ• āĻāĻŦāĻ‚ āĻŽāĻžāĻ˛ā§āĻŸāĻŋāĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻšāĻ“āĻ¯āĻŧāĻž āĻ¸āĻ¤ā§āĻ¤ā§āĻŦā§‡āĻ“, āĻ†āĻŽāĻ°āĻž āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻāĻŦāĻ‚ āĻŽā§‹āĻšāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ AWS-āĻ āĻĢā§‹āĻ•āĻžāĻ¸ āĻ•āĻ°āĻŋāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ unittest, āĻŸā§‡āĻ¸ā§āĻŸ āĻĢā§āĻ°ā§‡āĻŽāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻŦāĻž āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒāĻ›āĻ¨ā§āĻĻā§‡āĻ° āĻ…āĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨ā§‹ āĻŸā§‡āĻ¸ā§āĻŸ āĻĢā§āĻ°ā§‡āĻŽāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻ¯āĻžāĻ¨āĨ¤ āĻāĻŦāĻ‚, āĻ…āĻŦāĻļā§āĻ¯āĻ‡, āĻĒā§āĻ˛ā§āĻŽāĻŋ āĻ†āĻœā§āĻ°, āĻ—ā§āĻ—āĻ˛ āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ, āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĻā§āĻ°ā§āĻĻāĻžāĻ¨ā§āĻ¤ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĨ¤)

āĻ¯ā§‡āĻŽāĻ¨āĻŸāĻŋ āĻ†āĻŽāĻ°āĻž āĻĻā§‡āĻ–ā§‡āĻ›āĻŋ, āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…āĻŦāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ•ā§‹āĻĄ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻāĻŽāĻ¨ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ•āĻžāĻ°āĻŖ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ¤āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻšāĻ˛ āĻĒā§āĻ°āĻšāĻ˛āĻŋāĻ¤ āĻ‡āĻ‰āĻ¨āĻŋāĻŸ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĨ¤ āĻ•āĻžāĻ°āĻŖ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§‹āĻĄā§‡āĻ° āĻĢāĻžāĻ‚āĻļāĻ¨ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ - āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, CIDR āĻ—āĻŖāĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡, āĻ—āĻ¤āĻŋāĻļā§€āĻ˛āĻ­āĻžāĻŦā§‡ āĻ¨āĻžāĻŽ, āĻŸā§āĻ¯āĻžāĻ— āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ āĻ—āĻŖāĻ¨āĻž āĻ•āĻ°ā§āĻ¨āĨ¤ - āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻŽā§āĻ­āĻŦāĻ¤ āĻ¤āĻžāĻĻā§‡āĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡āĻŦā§‡āĻ¨āĨ¤ āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŋāĻ¤ āĻ‡āĻ‰āĻ¨āĻŋāĻŸ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ˛ā§‡āĻ–āĻžāĻ° āĻŽāĻ¤ā§‹āĻ‡āĨ¤
āĻāĻ•āĻŸā§ āĻŦā§‡āĻļāĻŋ āĻœāĻŸāĻŋāĻ˛ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ¸āĻŽā§āĻĒāĻĻ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻ•āĻ°ā§‡ āĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻŦā§āĻ¯āĻžāĻ–ā§āĻ¯āĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻ¸ā§āĻ¨ āĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻ•āĻ°āĻŋ āĻ¯ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ EC2 āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ†āĻŽāĻ°āĻž āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤āĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻšāĻ¤ā§‡ āĻšāĻžāĻ‡:

  • āĻĻā§ƒāĻˇā§āĻŸāĻžāĻ¨ā§āĻ¤ āĻāĻ•āĻŸāĻŋ āĻŸā§āĻ¯āĻžāĻ— āĻ†āĻ›ā§‡ Name.
  • āĻ‡āĻ¨āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸ āĻ‡āĻ¨āĻ˛āĻžāĻ‡āĻ¨ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¨āĻ¯āĻŧ userData - āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻāĻ•āĻŸāĻŋ AMI (āĻ›āĻŦāĻŋ) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤
  • āĻ•ā§‹āĻ¨ SSH āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸā§‡āĻ° āĻ¸āĻ‚āĻ¸ā§āĻĒāĻ°ā§āĻļā§‡ āĻĨāĻžāĻ•āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤

āĻāĻ‡ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ āĻ†āĻŽāĻžāĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ aws-js-webserver:

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;

āĻāĻŸāĻŋ āĻšāĻ˛ āĻŽā§ŒāĻ˛āĻŋāĻ• āĻĒā§āĻ˛ā§āĻŽāĻŋ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ: āĻāĻŸāĻŋ āĻ•ā§‡āĻŦāĻ˛ āĻāĻ•āĻŸāĻŋ EC2 āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻ—ā§āĻ°ā§āĻĒ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻ•āĻ°ā§‡āĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻāĻŸāĻŋ āĻ˛āĻ•ā§āĻˇ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¯ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻŽāĻ°āĻž āĻ‰āĻĒāĻ°ā§‡ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ­āĻ™ā§āĻ— āĻ•āĻ°āĻ›āĻŋāĨ¤ āĻ†āĻ¸ā§āĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ˛āĻŋāĻ–āĻŋ!

āĻ˛ā§‡āĻ–āĻžāĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŋāĻ¤ āĻŽā§‹āĻšāĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻŽāĻ¤ā§‹ āĻĻā§‡āĻ–āĻžāĻŦā§‡:

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();
                }
            });
        });

āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŋāĻ¤ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻŽāĻ¤ā§‹ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧ, āĻ¤āĻŦā§‡ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻ˛āĻ•ā§āĻˇāĻŖā§€āĻ¯āĻŧ:

  • āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ā§‡āĻ° āĻ†āĻ—ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒāĻĻā§‡āĻ° āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°āĻŋ, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋ āĻ¸āĻ°ā§āĻŦāĻĻāĻž "āĻĒā§āĻ˛ā§āĻ¯āĻžāĻ¨" (āĻŦāĻž "āĻĒā§āĻ°āĻŋāĻ­āĻŋāĻ‰") āĻŽā§‹āĻĄā§‡ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧāĨ¤ āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻāĻŽāĻ¨ āĻ…āĻ¨ā§‡āĻ• āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯āĻžāĻ° āĻŽāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ•ā§‡āĻŦāĻ˛ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¨āĻž āĻŦāĻž āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¨āĻžāĨ¤ āĻāĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻĒā§āĻ°āĻĻāĻžāĻ¨āĻ•āĻžāĻ°ā§€āĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻ—āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• - āĻ†āĻŽāĻ°āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ‡āĻ¨āĻĒā§āĻŸ āĻĄā§‡āĻŸāĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŋāĨ¤ āĻ†āĻŽāĻ°āĻž āĻĒāĻ°ā§‡ āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ¯āĻŧ āĻĢāĻŋāĻ°ā§‡ āĻ†āĻ¸āĻŦ, āĻ¯āĻ–āĻ¨ āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ•āĻĨāĻž āĻ†āĻ¸ā§‡āĨ¤
  • āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒā§āĻ˛ā§āĻŽāĻŋ āĻ°āĻŋāĻ¸ā§‹āĻ°ā§āĻ¸ āĻĒā§āĻ°āĻĒāĻžāĻ°ā§āĻŸāĻŋ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ, āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸āĻ­āĻžāĻŦā§‡ āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻ‡ āĻŽāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ•āĻ°āĻ¤ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤āĻŋ āĻāĻŦāĻ‚ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ–ā§āĻŦ āĻŽāĻŋāĻ˛ then .
  • āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ¯āĻŧ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨ āĻ‡āĻ‰āĻ†āĻ°āĻāĻ¨ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ›āĻŋ, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĢāĻžāĻ‚āĻļāĻ¨āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ pulumi.allāĻ¤āĻžāĻĻā§‡āĻ° āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡āĨ¤
  • āĻ…āĻŦāĻļā§‡āĻˇā§‡, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻāĻ‡ āĻŽāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸āĻ­āĻžāĻŦā§‡ āĻ—āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° Mocha āĻāĻ° āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ¨āĻŋāĻ°ā§āĻŽāĻŋāĻ¤ āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ• āĻ•āĻ˛āĻŦā§āĻ¯āĻžāĻ• āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ done āĻ…āĻĨāĻŦāĻž āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤āĻŋ āĻĢāĻŋāĻ°ā§‡.

āĻāĻ•āĻŦāĻžāĻ° āĻ†āĻŽāĻ°āĻž āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻšāĻœ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻŽāĻžāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ‡āĻ¨āĻĒā§āĻŸāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻĨāĻžāĻ•āĻŦā§‡āĨ¤ āĻ¸āĻŽā§āĻĒāĻ¤ā§āĻ¤āĻŋ tags āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻŽāĻžāĻ¨āĻšāĻŋāĻ¤ā§āĻ° (āĻ¸āĻšāĻ¯ā§‹āĻ—ā§€ āĻ…ā§āĻ¯āĻžāĻ°ā§‡), āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻŦ āĻāĻŸāĻŋ (1) āĻŽāĻŋāĻĨā§āĻ¯āĻž āĻ¨āĻ¯āĻŧ āĻāĻŦāĻ‚ (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();
                }
            });
        });

āĻāĻ–āĻžāĻ¨ā§‡āĻ‡ āĻļā§‡āĻˇ. āĻāĻ–āĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻšāĻžāĻ˛āĻžāĻ¨ā§‹ āĻ¯āĻžāĻ•!

āĻšāĻ˛āĻŽāĻžāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž

āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒāĻ›āĻ¨ā§āĻĻā§‡āĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻšāĻžāĻ˛āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻ¤āĻŦā§‡ āĻĒā§āĻ˛ā§āĻŽāĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯āĻž āĻŽāĻ¨ā§‹āĻ¯ā§‹āĻ— āĻĻā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻŽāĻ¤ā§‹āĨ¤
āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤, āĻĒā§āĻ˛ā§āĻŽāĻŋ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻ—ā§āĻ˛āĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯, āĻĒā§āĻ˛āĻŋāĻŽāĻŋ āĻ¸āĻŋāĻāĻ˛āĻ†āĻ‡ (āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻ‡āĻ¨ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻ­āĻžāĻˇāĻžāĻ° āĻ°āĻžāĻ¨āĻŸāĻžāĻ‡āĻŽ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°ā§‡, āĻĒā§āĻ˛ā§āĻŽāĻŋ āĻ‡āĻžā§āĻœāĻŋāĻ¨ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻ•āĻ°ā§‡ āĻ¯āĻžāĻ¤ā§‡ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ˛āĻžāĻĒāĻ—ā§āĻ˛āĻŋ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻžāĻ¯āĻŧ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ†āĻ›ā§‡. āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ•āĻžāĻ āĻžāĻŽā§‹āĻ° āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖā§‡ āĻšāĻ˛āĻžāĻ•āĻžāĻ˛ā§€āĻ¨, CLI āĻāĻŦāĻ‚ āĻĒā§āĻ˛ā§āĻŽāĻŋ āĻ‡āĻžā§āĻœāĻŋāĻ¨ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ•ā§‹āĻ¨ā§‹ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻĨāĻžāĻ•āĻŦā§‡ āĻ¨āĻžāĨ¤

āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻŸāĻŋ āĻĒā§‡āĻ¤ā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§‡āĻŦāĻ˛ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤āĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡:

  • āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻ¨āĻžāĻŽ, āĻ¯āĻž āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ PULUMI_NODEJS_PROJECT (āĻŦāĻž, āĻ†āĻ°ā§‹ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ­āĻžāĻŦā§‡, PULUMI__PROJECT Đ´ĐģŅ Đ´Ņ€ŅƒĐŗиŅ… ŅĐˇŅ‹ĐēОв).
    āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻž āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ•ā§‡āĻ° āĻ¨āĻžāĻŽ PULUMI_NODEJS_STACK (āĻŦāĻž, āĻ†āĻ°ā§‹ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ­āĻžāĻŦā§‡, PULUMI__ STACK).
    āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ• āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛. āĻ¤āĻžāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ PULUMI_CONFIG āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ āĻšāĻ˛ āĻ•ā§€/āĻŽāĻžāĻ¨ āĻœā§‹āĻĄāĻŧāĻž āĻ¸āĻš JSON āĻŽāĻžāĻ¨āĻšāĻŋāĻ¤ā§āĻ°āĨ¤

    āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŸāĻŋ āĻ¸āĻ¤āĻ°ā§āĻ•āĻ¤āĻž āĻœāĻžāĻ°āĻŋ āĻ•āĻ°āĻŦā§‡ āĻ¯āĻž āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°ā§‡ āĻ¯ā§‡ āĻ¸āĻŋāĻāĻ˛āĻ†āĻ‡/āĻ‡āĻžā§āĻœāĻŋāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻŸāĻŋ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻ¨āĻ¯āĻŧāĨ¤ āĻāĻŸāĻŋ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻžāĻ°āĻŖ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ†āĻ¸āĻ˛ā§‡ āĻ•āĻŋāĻ›ā§ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¨āĻž āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ†āĻļā§āĻšāĻ°ā§āĻ¯āĻœāĻ¨āĻ• āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¤āĻž āĻ¨āĻž āĻšāĻ¯āĻŧ! āĻĒā§āĻ˛ā§āĻŽāĻŋāĻ•ā§‡ āĻŦāĻ˛āĻ¤ā§‡ āĻ¯ā§‡ āĻāĻŸāĻŋāĻ‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨, āĻ†āĻĒāĻ¨āĻŋ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ 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)

    āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ āĻŋāĻ•āĻ āĻžāĻ• āĻšāĻ¯āĻŧā§‡āĻ›ā§‡... āĻšā§āĻ°āĻ°ā§‡! ✓✓✓

    āĻ†āĻœāĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŸāĻžāĻ‡, āĻ¤āĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻ…āĻ¨ā§āĻŦāĻžāĻĻā§‡āĻ° āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻ…āĻ‚āĻļā§‡ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻžāĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻŦ 😉

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨