From 41d7ef563200b64044872674999dd87ff53bda68 Mon Sep 17 00:00:00 2001 From: yousefaloufi6 Date: Sun, 12 Oct 2025 18:11:20 +0300 Subject: [PATCH 1/2] Update .gitignore to ignore nested backup --- .gitignore | 4 + .../terraform/.git_backup/FETCH_HEAD | 0 .../terraform/.git_backup/HEAD | 1 + .../terraform/.git_backup/config | 6 + .../terraform/.git_backup/description | 1 + .../.git_backup/hooks/applypatch-msg.sample | 15 ++ .../.git_backup/hooks/commit-msg.sample | 24 +++ .../hooks/fsmonitor-watchman.sample | 174 ++++++++++++++++++ .../.git_backup/hooks/post-update.sample | 8 + .../.git_backup/hooks/pre-applypatch.sample | 14 ++ .../.git_backup/hooks/pre-commit.sample | 49 +++++ .../.git_backup/hooks/pre-merge-commit.sample | 13 ++ .../.git_backup/hooks/pre-push.sample | 53 ++++++ .../.git_backup/hooks/pre-rebase.sample | 169 +++++++++++++++++ .../.git_backup/hooks/pre-receive.sample | 24 +++ .../hooks/prepare-commit-msg.sample | 42 +++++ .../.git_backup/hooks/push-to-checkout.sample | 78 ++++++++ .../hooks/sendemail-validate.sample | 77 ++++++++ .../terraform/.git_backup/hooks/update.sample | 128 +++++++++++++ .../terraform/.git_backup/info/exclude | 6 + .../terraform/containers-secrets-patch.json | 3 + .../terraform/containers.json | 14 ++ azure-3tier-reference/terraform/main.tf | 83 +++++++++ .../terraform/modules/appgw/main.tf | 119 ++++++++++++ .../terraform/modules/appgw/variables.tf | 16 ++ .../terraform/modules/containerapps/main.tf | 109 +++++++++++ .../modules/containerapps/variables.tf | 23 +++ .../terraform/modules/monitoring/main.tf | 27 +++ .../terraform/modules/monitoring/variables.tf | 3 + .../terraform/modules/network/main.tf | 60 ++++++ .../terraform/modules/network/variables.tf | 3 + .../terraform/modules/sql/main.tf | 47 +++++ .../terraform/modules/sql/variables.tf | 7 + azure-3tier-reference/terraform/plan.tfplan | Bin 0 -> 27591 bytes azure-3tier-reference/terraform/tfplan | Bin 0 -> 29119 bytes azure-3tier-reference/terraform/variables.tf | 50 +++++ 36 files changed, 1450 insertions(+) create mode 100644 azure-3tier-reference/terraform/.git_backup/FETCH_HEAD create mode 100644 azure-3tier-reference/terraform/.git_backup/HEAD create mode 100644 azure-3tier-reference/terraform/.git_backup/config create mode 100644 azure-3tier-reference/terraform/.git_backup/description create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/applypatch-msg.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/commit-msg.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/fsmonitor-watchman.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/post-update.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/pre-applypatch.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/pre-commit.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/pre-merge-commit.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/pre-push.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/pre-rebase.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/pre-receive.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/prepare-commit-msg.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/push-to-checkout.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/sendemail-validate.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/hooks/update.sample create mode 100644 azure-3tier-reference/terraform/.git_backup/info/exclude create mode 100644 azure-3tier-reference/terraform/containers-secrets-patch.json create mode 100644 azure-3tier-reference/terraform/containers.json create mode 100644 azure-3tier-reference/terraform/main.tf create mode 100644 azure-3tier-reference/terraform/modules/appgw/main.tf create mode 100644 azure-3tier-reference/terraform/modules/appgw/variables.tf create mode 100644 azure-3tier-reference/terraform/modules/containerapps/main.tf create mode 100644 azure-3tier-reference/terraform/modules/containerapps/variables.tf create mode 100644 azure-3tier-reference/terraform/modules/monitoring/main.tf create mode 100644 azure-3tier-reference/terraform/modules/monitoring/variables.tf create mode 100644 azure-3tier-reference/terraform/modules/network/main.tf create mode 100644 azure-3tier-reference/terraform/modules/network/variables.tf create mode 100644 azure-3tier-reference/terraform/modules/sql/main.tf create mode 100644 azure-3tier-reference/terraform/modules/sql/variables.tf create mode 100644 azure-3tier-reference/terraform/plan.tfplan create mode 100644 azure-3tier-reference/terraform/tfplan create mode 100644 azure-3tier-reference/terraform/variables.tf diff --git a/.gitignore b/.gitignore index bc4f97a..c088c36 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,7 @@ yarn-error.log* **/**/*.tfstate **/**/target/ +*.terraform/ +*.tfvars +*.tfstate +*.tfstate.*.git_backup/ diff --git a/azure-3tier-reference/terraform/.git_backup/FETCH_HEAD b/azure-3tier-reference/terraform/.git_backup/FETCH_HEAD new file mode 100644 index 0000000..e69de29 diff --git a/azure-3tier-reference/terraform/.git_backup/HEAD b/azure-3tier-reference/terraform/.git_backup/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/azure-3tier-reference/terraform/.git_backup/config b/azure-3tier-reference/terraform/.git_backup/config new file mode 100644 index 0000000..8ad0b1b --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = false + bare = false + logallrefupdates = true + ignorecase = true diff --git a/azure-3tier-reference/terraform/.git_backup/description b/azure-3tier-reference/terraform/.git_backup/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/applypatch-msg.sample b/azure-3tier-reference/terraform/.git_backup/hooks/applypatch-msg.sample new file mode 100644 index 0000000..a5d7b84 --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/commit-msg.sample b/azure-3tier-reference/terraform/.git_backup/hooks/commit-msg.sample new file mode 100644 index 0000000..b58d118 --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/fsmonitor-watchman.sample b/azure-3tier-reference/terraform/.git_backup/hooks/fsmonitor-watchman.sample new file mode 100644 index 0000000..23e856f --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IPC::Open2; + +# An example hook script to integrate Watchman +# (https://facebook.github.io/watchman/) with git to speed up detecting +# new and modified files. +# +# The hook is passed a version (currently 2) and last update token +# formatted as a string and outputs to stdout a new update token and +# all files that have been modified since the update token. Paths must +# be relative to the root of the working tree and separated by a single NUL. +# +# To enable this hook, rename this file to "query-watchman" and set +# 'git config core.fsmonitor .git/hooks/query-watchman' +# +my ($version, $last_update_token) = @ARGV; + +# Uncomment for debugging +# print STDERR "$0 $version $last_update_token\n"; + +# Check the hook interface version +if ($version ne 2) { + die "Unsupported query-fsmonitor hook version '$version'.\n" . + "Falling back to scanning...\n"; +} + +my $git_work_tree = get_working_dir(); + +my $retry = 1; + +my $json_pkg; +eval { + require JSON::XS; + $json_pkg = "JSON::XS"; + 1; +} or do { + require JSON::PP; + $json_pkg = "JSON::PP"; +}; + +launch_watchman(); + +sub launch_watchman { + my $o = watchman_query(); + if (is_work_tree_watched($o)) { + output_result($o->{clock}, @{$o->{files}}); + } +} + +sub output_result { + my ($clockid, @files) = @_; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # binmode $fh, ":utf8"; + # print $fh "$clockid\n@files\n"; + # close $fh; + + binmode STDOUT, ":utf8"; + print $clockid; + print "\0"; + local $, = "\0"; + print @files; +} + +sub watchman_clock { + my $response = qx/watchman clock "$git_work_tree"/; + die "Failed to get clock id on '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + + return $json_pkg->new->utf8->decode($response); +} + +sub watchman_query { + my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') + or die "open2() failed: $!\n" . + "Falling back to scanning...\n"; + + # In the query expression below we're asking for names of files that + # changed since $last_update_token but not from the .git folder. + # + # To accomplish this, we're using the "since" generator to use the + # recency index to select candidate nodes and "fields" to limit the + # output to file names only. Then we're using the "expression" term to + # further constrain the results. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "fields": ["name"], + "expression": ["not", ["dirname", ".git"]] + }] + END + + # Uncomment for debugging the watchman query + # open (my $fh, ">", ".git/watchman-query.json"); + # print $fh $query; + # close $fh; + + print CHLD_IN $query; + close CHLD_IN; + my $response = do {local $/; }; + + # Uncomment for debugging the watch response + # open ($fh, ">", ".git/watchman-response.json"); + # print $fh $response; + # close $fh; + + die "Watchman: command returned no output.\n" . + "Falling back to scanning...\n" if $response eq ""; + die "Watchman: command returned invalid output: $response\n" . + "Falling back to scanning...\n" unless $response =~ /^\{/; + + return $json_pkg->new->utf8->decode($response); +} + +sub is_work_tree_watched { + my ($output) = @_; + my $error = $output->{error}; + if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { + $retry--; + my $response = qx/watchman watch "$git_work_tree"/; + die "Failed to make watchman watch '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + $output = $json_pkg->new->utf8->decode($response); + $error = $output->{error}; + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # close $fh; + + # Watchman will always return all files on the first query so + # return the fast "everything is dirty" flag to git and do the + # Watchman query just to get it over with now so we won't pay + # the cost in git to look up each individual file. + my $o = watchman_clock(); + $error = $output->{error}; + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + output_result($o->{clock}, ("/")); + $last_update_token = $o->{clock}; + + eval { launch_watchman() }; + return 0; + } + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + return 1; +} + +sub get_working_dir { + my $working_dir; + if ($^O =~ 'msys' || $^O =~ 'cygwin') { + $working_dir = Win32::GetCwd(); + $working_dir =~ tr/\\/\//; + } else { + require Cwd; + $working_dir = Cwd::cwd(); + } + + return $working_dir; +} diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/post-update.sample b/azure-3tier-reference/terraform/.git_backup/hooks/post-update.sample new file mode 100644 index 0000000..ec17ec1 --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/pre-applypatch.sample b/azure-3tier-reference/terraform/.git_backup/hooks/pre-applypatch.sample new file mode 100644 index 0000000..4142082 --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/pre-commit.sample b/azure-3tier-reference/terraform/.git_backup/hooks/pre-commit.sample new file mode 100644 index 0000000..e144712 --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/pre-merge-commit.sample b/azure-3tier-reference/terraform/.git_backup/hooks/pre-merge-commit.sample new file mode 100644 index 0000000..399eab1 --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/pre-push.sample b/azure-3tier-reference/terraform/.git_backup/hooks/pre-push.sample new file mode 100644 index 0000000..4ce688d --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/pre-rebase.sample b/azure-3tier-reference/terraform/.git_backup/hooks/pre-rebase.sample new file mode 100644 index 0000000..6cbef5c --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/pre-receive.sample b/azure-3tier-reference/terraform/.git_backup/hooks/pre-receive.sample new file mode 100644 index 0000000..a1fd29e --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/prepare-commit-msg.sample b/azure-3tier-reference/terraform/.git_backup/hooks/prepare-commit-msg.sample new file mode 100644 index 0000000..10fa14c --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/push-to-checkout.sample b/azure-3tier-reference/terraform/.git_backup/hooks/push-to-checkout.sample new file mode 100644 index 0000000..af5a0c0 --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/azure-3tier-reference/terraform/.git_backup/hooks/update.sample b/azure-3tier-reference/terraform/.git_backup/hooks/update.sample new file mode 100644 index 0000000..c4d426b --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/azure-3tier-reference/terraform/.git_backup/info/exclude b/azure-3tier-reference/terraform/.git_backup/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/azure-3tier-reference/terraform/.git_backup/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/azure-3tier-reference/terraform/containers-secrets-patch.json b/azure-3tier-reference/terraform/containers-secrets-patch.json new file mode 100644 index 0000000..9cd5997 --- /dev/null +++ b/azure-3tier-reference/terraform/containers-secrets-patch.json @@ -0,0 +1,3 @@ +[ + { + diff --git a/azure-3tier-reference/terraform/containers.json b/azure-3tier-reference/terraform/containers.json new file mode 100644 index 0000000..cce18b6 --- /dev/null +++ b/azure-3tier-reference/terraform/containers.json @@ -0,0 +1,14 @@ +[ + { + "name": "backend", + "image": "yousefaloufi6/backend-app:latest", + "env": [ + { "name": "DB_HOST", "value": "3tier-sqlserver.database.windows.net" }, + { "name": "DB_NAME", "value": "3tier-db" }, + { "name": "DB_USER", "value": "yousefaloufi1" }, + { "name": "DB_PASS", "value": "P@ssward1234!" } + ], + "probes": [], + "resources": { "cpu": 0.5, "ephemeralStorage": "2Gi", "memory": "1Gi" } + } +] diff --git a/azure-3tier-reference/terraform/main.tf b/azure-3tier-reference/terraform/main.tf new file mode 100644 index 0000000..bdedc4d --- /dev/null +++ b/azure-3tier-reference/terraform/main.tf @@ -0,0 +1,83 @@ +// Root module for Azure 3-tier reference +terraform { + required_version = ">= 1.5.0" + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "~> 3.50" + } + } +} + +provider "azurerm" { + features {} +} + +# Remote state is left for you to configure. Use backend "azurerm" with storage account. + +module "network" { + source = "./modules/network" + prefix = var.prefix + location = var.location + resource_group_name = var.resource_group_name +} + +module "monitoring" { + source = "./modules/monitoring" + resource_group_name = module.network.resource_group_name + location = var.location + prefix = var.prefix +} + +module "sql" { + source = "./modules/sql" + resource_group_name = module.network.resource_group_name + location = var.location + db_admin = var.db_admin + db_password = var.db_password + db_subnet_id = module.network.db_pe_subnet_id + vnet_id = module.network.vnet_id + prefix = var.prefix +} + +module "containerapps" { + source = "./modules/containerapps" + resource_group_name = module.network.resource_group_name + location = var.location + prefix = var.prefix + environment_subnet_id = module.network.aca_env_subnet_id + frontend_image = var.frontend_image + backend_image = var.backend_image + environment_id = var.existing_environment_id + # User-specified DB settings + # Use the SQL server FQDN from the sql module (was a hard-coded placeholder 'aloufi') + db_host = module.sql.db_fqdn + # The database name comes from the sql module + db_name = module.sql.db_name + # Use the fully-qualified SQL login (user@servername) + db_user = "yousefaloufi1@3tier-sqlserver" + # Reuse the existing db_password variable instead of duplicating a literal here + db_pass = var.db_password +} + +module "appgw" { + source = "./modules/appgw" + resource_group_name = module.network.resource_group_name + location = var.location + prefix = var.prefix + frontend_fqdn = module.containerapps.frontend_fqdn + backend_fqdn = module.containerapps.backend_fqdn + appgw_subnet_id = module.network.appgw_subnet_id +} + +output "appgw_public_ip" { + value = module.appgw.appgw_public_ip +} + +output "frontend_fqdn" { + value = module.containerapps.frontend_fqdn +} + +output "backend_fqdn" { + value = module.containerapps.backend_fqdn +} diff --git a/azure-3tier-reference/terraform/modules/appgw/main.tf b/azure-3tier-reference/terraform/modules/appgw/main.tf new file mode 100644 index 0000000..91abc08 --- /dev/null +++ b/azure-3tier-reference/terraform/modules/appgw/main.tf @@ -0,0 +1,119 @@ +resource "azurerm_public_ip" "pip" { + name = "appgw-pip" + resource_group_name = var.resource_group_name + location = var.location + allocation_method = "Static" + sku = "Standard" +} + +resource "azurerm_application_gateway" "appgw" { + name = "appgw-${var.prefix}" + resource_group_name = var.resource_group_name + location = var.location + sku { + name = "WAF_v2" + tier = "WAF_v2" + capacity = 2 + } + gateway_ip_configuration { + name = "appgw-ip" + subnet_id = var.appgw_subnet_id + } + frontend_ip_configuration { + name = "appgw-frontend-ip" + public_ip_address_id = azurerm_public_ip.pip.id + } + frontend_port { + name = "http" + port = 80 + } + + # HTTPS frontend port and listener intentionally omitted to avoid requiring an SSL certificate here. + + backend_address_pool { + name = "frontend-pool" + fqdns = [var.frontend_fqdn] + } + + backend_address_pool { + name = "backend-pool" + fqdns = [var.backend_fqdn] + } + + backend_http_settings { + name = "http-settings" + port = 80 + protocol = "Http" + cookie_based_affinity = "Disabled" + # Ensure the Host header sent to backend matches the Container Apps FQDN + host_name = var.backend_fqdn + } + + probe { + name = "health-probe" + protocol = "Http" + path = "/actuator/health" + port = 80 + host = var.backend_fqdn + interval = 30 + timeout = 30 + unhealthy_threshold = 3 + match { + status_code = ["200-399"] + } + } + + http_listener { + name = "listener-http" + frontend_ip_configuration_name = "appgw-frontend-ip" + frontend_port_name = "http" + protocol = "Http" + } + + # HTTPS listener intentionally omitted in this module to avoid SSL cert management in the module. + url_path_map { + name = "urlmap" + default_backend_address_pool_name = "frontend-pool" + default_backend_http_settings_name = "http-settings" + path_rule { + name = "api-rule" + paths = ["/api/*"] + backend_address_pool_name = "backend-pool" + backend_http_settings_name = "http-settings" + } + } + request_routing_rule { + name = "rule" + rule_type = "PathBasedRouting" + http_listener_name = "listener-http" + url_path_map_name = "urlmap" + priority = 100 + } + + waf_configuration { + enabled = true + firewall_mode = "Prevention" + rule_set_type = "OWASP" + rule_set_version = "3.2" + } + + # Use a predefined SSL policy to ensure TLS 1.2+ and avoid deprecated protocol versions + ssl_policy { + policy_type = "Predefined" + policy_name = "AppGwSslPolicy20170401S" + } + lifecycle { + # Workaround for provider returning computed backend_address_pool values that + # don't correlate with planned set elements during apply (inconsistent final plan). + # Ignoring changes to backend_address_pool lets terraform finish the apply. + # Follow-up: refactor backend pools into standalone resources or upgrade the + # azurerm provider to a version where this bug is fixed, then remove this. + ignore_changes = [backend_address_pool] + } + + depends_on = [] +} + +output "appgw_public_ip" { value = azurerm_public_ip.pip.ip_address } + +output "appgw_id" { value = azurerm_application_gateway.appgw.id } \ No newline at end of file diff --git a/azure-3tier-reference/terraform/modules/appgw/variables.tf b/azure-3tier-reference/terraform/modules/appgw/variables.tf new file mode 100644 index 0000000..21b6fa8 --- /dev/null +++ b/azure-3tier-reference/terraform/modules/appgw/variables.tf @@ -0,0 +1,16 @@ +variable "resource_group_name" { type = string } +variable "location" { type = string } +variable "frontend_fqdn" { type = string } +variable "backend_fqdn" { type = string } +variable "appgw_subnet_id" { type = string } +variable "prefix" { + type = string + description = "Name prefix used when creating the Application Gateway" + default = "app" +} + +variable "ssl_certificate_name" { + type = string + description = "Optional name of an existing SSL certificate resource to reference for HTTPS listeners" + default = null +} \ No newline at end of file diff --git a/azure-3tier-reference/terraform/modules/containerapps/main.tf b/azure-3tier-reference/terraform/modules/containerapps/main.tf new file mode 100644 index 0000000..a169c7c --- /dev/null +++ b/azure-3tier-reference/terraform/modules/containerapps/main.tf @@ -0,0 +1,109 @@ +locals { + use_existing_env = length(trimspace(var.environment_id)) > 0 + + # Create a short deterministic, safe prefix from the md5 of the user-provided prefix. + # This guarantees: lower-case hex characters, starts with a letter ('a'), and stays short. + # Format: a + first 7 chars of md5(prefix) => total length 8 + safe_hash = substr(md5(var.prefix), 0, 7) + name_prefix = "a${local.safe_hash}" + + # If an existing environment id is provided, use it. Otherwise, if we created an env, use its first instance id. + env_id = local.use_existing_env ? var.environment_id : (length(azurerm_container_app_environment.env) > 0 ? azurerm_container_app_environment.env[0].id : "") +} + +resource "azurerm_container_app_environment" "env" { + count = local.use_existing_env ? 0 : 1 + name = "aca-${local.name_prefix}-env" + location = var.location + resource_group_name = var.resource_group_name + internal_load_balancer_enabled = true + infrastructure_subnet_id = var.environment_subnet_id +} + +resource "azurerm_container_app" "frontend" { + name = "${local.name_prefix}-frontend-app" + resource_group_name = var.resource_group_name + container_app_environment_id = local.env_id + revision_mode = "Single" + template { + container { + name = "frontend" + image = var.frontend_image + cpu = 0.5 + memory = "1Gi" + } + } + ingress { + external_enabled = false + target_port = 80 + transport = "http" + traffic_weight { + latest_revision = true + percentage = 100 + } + } +} + +resource "azurerm_container_app" "backend" { + name = "${local.name_prefix}-backend-app" + resource_group_name = var.resource_group_name + container_app_environment_id = local.env_id + revision_mode = "Single" + template { + container { + name = "backend" + image = var.backend_image + cpu = 0.5 + memory = "1Gi" + env { + name = "DB_HOST" + value = var.db_host + } + env { + name = "SPRING_DATASOURCE_URL" + value = "jdbc:sqlserver://${var.db_host}:1433;database=${var.db_name};encrypt=true;trustServerCertificate=false;loginTimeout=30;" + } + env { + name = "SPRING_DATASOURCE_USERNAME" + value = var.db_user + } + env { + name = "SPRING_DATASOURCE_PASSWORD" + value = var.db_pass + } + env { + name = "DB_NAME" + value = var.db_name + } + env { + name = "DB_USERNAME" + value = var.db_user + } + env { + name = "DB_PASSWORD" + value = var.db_pass + } + } + } + ingress { + external_enabled = false + target_port = 8080 + transport = "http" + traffic_weight { + latest_revision = true + percentage = 100 + } + } +} + +output "frontend_fqdn" { + value = azurerm_container_app.frontend.ingress[0].fqdn +} + +output "backend_fqdn" { + value = azurerm_container_app.backend.ingress[0].fqdn +} + +output "environment_id" { + value = local.env_id +} \ No newline at end of file diff --git a/azure-3tier-reference/terraform/modules/containerapps/variables.tf b/azure-3tier-reference/terraform/modules/containerapps/variables.tf new file mode 100644 index 0000000..0fcedfb --- /dev/null +++ b/azure-3tier-reference/terraform/modules/containerapps/variables.tf @@ -0,0 +1,23 @@ +variable "resource_group_name" { type = string } +variable "location" { type = string } +variable "environment_subnet_id" { type = string } +variable "frontend_image" { type = string } +variable "backend_image" { type = string } +variable "db_host" { + type = string + default = "3tier-sqlserver.database.windows.net" +} +variable "db_name" { type = string } +variable "db_user" { type = string } +variable "db_pass" { type = string } +variable "environment_id" { + description = "(Optional) Existing Container Apps Environment resource id. If provided, Terraform will not create a new environment." + type = string + default = "" +} + +variable "prefix" { + type = string + description = "Name prefix used for container apps and environment" + default = "3tier" +} \ No newline at end of file diff --git a/azure-3tier-reference/terraform/modules/monitoring/main.tf b/azure-3tier-reference/terraform/modules/monitoring/main.tf new file mode 100644 index 0000000..88629c3 --- /dev/null +++ b/azure-3tier-reference/terraform/modules/monitoring/main.tf @@ -0,0 +1,27 @@ +resource "azurerm_log_analytics_workspace" "law" { + name = "${var.prefix}-law" + location = var.location + resource_group_name = var.resource_group_name + sku = "PerGB2018" + retention_in_days = 30 +} + +resource "azurerm_application_insights" "ai_frontend" { + name = "${var.prefix}-ai-frontend" + resource_group_name = var.resource_group_name + location = var.location + application_type = "web" + workspace_id = azurerm_log_analytics_workspace.law.id +} + +resource "azurerm_application_insights" "ai_backend" { + name = "${var.prefix}-ai-backend" + resource_group_name = var.resource_group_name + location = var.location + application_type = "web" + workspace_id = azurerm_log_analytics_workspace.law.id +} + +output "log_analytics_workspace_id" { value = azurerm_log_analytics_workspace.law.id } +output "ai_frontend_instrumentation_key" { value = azurerm_application_insights.ai_frontend.instrumentation_key } +output "ai_backend_instrumentation_key" { value = azurerm_application_insights.ai_backend.instrumentation_key } \ No newline at end of file diff --git a/azure-3tier-reference/terraform/modules/monitoring/variables.tf b/azure-3tier-reference/terraform/modules/monitoring/variables.tf new file mode 100644 index 0000000..af865a4 --- /dev/null +++ b/azure-3tier-reference/terraform/modules/monitoring/variables.tf @@ -0,0 +1,3 @@ +variable "resource_group_name" { type = string } +variable "location" { type = string } +variable "prefix" { type = string } \ No newline at end of file diff --git a/azure-3tier-reference/terraform/modules/network/main.tf b/azure-3tier-reference/terraform/modules/network/main.tf new file mode 100644 index 0000000..6e683c1 --- /dev/null +++ b/azure-3tier-reference/terraform/modules/network/main.tf @@ -0,0 +1,60 @@ +resource "azurerm_resource_group" "rg" { + name = var.resource_group_name + location = var.location +} + +resource "azurerm_virtual_network" "vnet" { + name = "${var.prefix}-vnet" + resource_group_name = azurerm_resource_group.rg.name + location = azurerm_resource_group.rg.location + address_space = ["10.10.0.0/16"] +} + +resource "azurerm_subnet" "appgw_subnet" { + name = "snet-appgw" + resource_group_name = azurerm_resource_group.rg.name + virtual_network_name = azurerm_virtual_network.vnet.name + address_prefixes = ["10.10.1.0/24"] +} + +resource "azurerm_subnet" "aca_env_subnet" { + name = "snet-aca-env" + resource_group_name = azurerm_resource_group.rg.name + virtual_network_name = azurerm_virtual_network.vnet.name + address_prefixes = ["10.10.2.0/23"] +} + +resource "azurerm_subnet" "db_pe_subnet" { + name = "snet-db-pe" + resource_group_name = azurerm_resource_group.rg.name + virtual_network_name = azurerm_virtual_network.vnet.name + address_prefixes = ["10.10.4.0/24"] + private_endpoint_network_policies = "Disabled" +} + +resource "azurerm_subnet" "ops_subnet" { + name = "snet-ops" + resource_group_name = azurerm_resource_group.rg.name + virtual_network_name = azurerm_virtual_network.vnet.name + address_prefixes = ["10.10.5.0/24"] +} + +output "vnet_id" { + value = azurerm_virtual_network.vnet.id +} + +output "aca_env_subnet_id" { + value = azurerm_subnet.aca_env_subnet.id +} + +output "db_pe_subnet_id" { + value = azurerm_subnet.db_pe_subnet.id +} + +output "appgw_subnet_id" { + value = azurerm_subnet.appgw_subnet.id +} + +output "resource_group_name" { + value = azurerm_resource_group.rg.name +} \ No newline at end of file diff --git a/azure-3tier-reference/terraform/modules/network/variables.tf b/azure-3tier-reference/terraform/modules/network/variables.tf new file mode 100644 index 0000000..00227ea --- /dev/null +++ b/azure-3tier-reference/terraform/modules/network/variables.tf @@ -0,0 +1,3 @@ +variable "prefix" { type = string } +variable "location" { type = string } +variable "resource_group_name" { type = string } \ No newline at end of file diff --git a/azure-3tier-reference/terraform/modules/sql/main.tf b/azure-3tier-reference/terraform/modules/sql/main.tf new file mode 100644 index 0000000..34ad743 --- /dev/null +++ b/azure-3tier-reference/terraform/modules/sql/main.tf @@ -0,0 +1,47 @@ +resource "azurerm_mssql_server" "sql" { + name = "${var.prefix}-sqlserver" + resource_group_name = var.resource_group_name + location = var.location + version = "12.0" + administrator_login = var.db_admin + administrator_login_password = var.db_password +} + +resource "azurerm_mssql_database" "db" { + name = "${var.prefix}-db" + server_id = azurerm_mssql_server.sql.id + sku_name = "S0" +} + +resource "azurerm_private_endpoint" "sql_pe" { + name = "sql-pe" + resource_group_name = var.resource_group_name + location = var.location + subnet_id = var.db_subnet_id + private_service_connection { + name = "sql-pe-conn" + private_connection_resource_id = azurerm_mssql_server.sql.id + subresource_names = ["sqlServer"] + is_manual_connection = false + } +} + +resource "azurerm_private_dns_zone" "sql" { + name = "privatelink.database.windows.net" + resource_group_name = var.resource_group_name +} + +resource "azurerm_private_dns_zone_virtual_network_link" "link" { + name = "sql-link" + resource_group_name = var.resource_group_name + private_dns_zone_name = azurerm_private_dns_zone.sql.name + virtual_network_id = var.vnet_id +} + +output "db_fqdn" { + value = azurerm_mssql_server.sql.fully_qualified_domain_name +} + +output "db_name" { + value = azurerm_mssql_database.db.name +} \ No newline at end of file diff --git a/azure-3tier-reference/terraform/modules/sql/variables.tf b/azure-3tier-reference/terraform/modules/sql/variables.tf new file mode 100644 index 0000000..4a73f93 --- /dev/null +++ b/azure-3tier-reference/terraform/modules/sql/variables.tf @@ -0,0 +1,7 @@ +variable "resource_group_name" { type = string } +variable "location" { type = string } +variable "db_admin" { type = string } +variable "db_password" { type = string } +variable "db_subnet_id" { type = string } +variable "vnet_id" { type = string } +variable "prefix" { type = string } \ No newline at end of file diff --git a/azure-3tier-reference/terraform/plan.tfplan b/azure-3tier-reference/terraform/plan.tfplan new file mode 100644 index 0000000000000000000000000000000000000000..5c37ed61548665ee7790739b68033a65d6b29a87 GIT binary patch literal 27591 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 P1pMIy7k}?e9*_P9g=Qv; literal 0 HcmV?d00001 diff --git a/azure-3tier-reference/terraform/tfplan b/azure-3tier-reference/terraform/tfplan new file mode 100644 index 0000000000000000000000000000000000000000..00aef2df9ad2cdbe308f1b647863d67b657b1e43 GIT binary patch literal 29119 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 Date: Sun, 12 Oct 2025 18:12:00 +0300 Subject: [PATCH 2/2] Add azure-3tier-reference/terraform into repo (remove nested .git) --- .../terraform/terraform.tfstate.backup | 1266 +++++++++++++++++ 1 file changed, 1266 insertions(+) create mode 100644 azure-3tier-reference/terraform/terraform.tfstate.backup diff --git a/azure-3tier-reference/terraform/terraform.tfstate.backup b/azure-3tier-reference/terraform/terraform.tfstate.backup new file mode 100644 index 0000000..f4b509f --- /dev/null +++ b/azure-3tier-reference/terraform/terraform.tfstate.backup @@ -0,0 +1,1266 @@ +{ + "version": 4, + "terraform_version": "1.13.3", + "serial": 53, + "lineage": "052cb15c-2edf-19fe-c4e3-b2c8c3067826", + "outputs": { + "appgw_public_ip": { + "value": "68.218.101.131", + "type": "string" + }, + "backend_fqdn": { + "value": "a40c7601-backend-app.internal.redbush-51cb9b9d.australiaeast.azurecontainerapps.io", + "type": "string" + }, + "frontend_fqdn": { + "value": "a40c7601-frontend-app.internal.redbush-51cb9b9d.australiaeast.azurecontainerapps.io", + "type": "string" + } + }, + "resources": [ + { + "module": "module.appgw", + "mode": "managed", + "type": "azurerm_application_gateway", + "name": "appgw", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "authentication_certificate": [], + "autoscale_configuration": [], + "backend_address_pool": [ + { + "fqdns": [ + "a40c7601-frontend-app.internal.redbush-51cb9b9d.australiaeast.azurecontainerapps.io" + ], + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/backendAddressPools/frontend-pool", + "ip_addresses": [], + "name": "frontend-pool" + }, + { + "fqdns": [], + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/backendAddressPools/backend-pool", + "ip_addresses": [ + "10.10.2.94" + ], + "name": "backend-pool" + } + ], + "backend_http_settings": [ + { + "affinity_cookie_name": "", + "authentication_certificate": [], + "connection_draining": [], + "cookie_based_affinity": "Disabled", + "host_name": "", + "id": "", + "name": "http-settings", + "path": "", + "pick_host_name_from_backend_address": true, + "port": 80, + "probe_id": "", + "probe_name": "", + "protocol": "Http", + "request_timeout": 30, + "trusted_root_certificate_names": [] + } + ], + "custom_error_configuration": [], + "enable_http2": false, + "fips_enabled": false, + "firewall_policy_id": "", + "force_firewall_policy_association": false, + "frontend_ip_configuration": [ + { + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/frontendIPConfigurations/appgw-frontend-ip", + "name": "appgw-frontend-ip", + "private_ip_address": "", + "private_ip_address_allocation": "Dynamic", + "private_link_configuration_id": "", + "private_link_configuration_name": "", + "public_ip_address_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/publicIPAddresses/appgw-pip", + "subnet_id": "" + } + ], + "frontend_port": [ + { + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/frontendPorts/http", + "name": "http", + "port": 80 + } + ], + "gateway_ip_configuration": [ + { + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/gatewayIPConfigurations/appgw-ip", + "name": "appgw-ip", + "subnet_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet/subnets/snet-appgw" + } + ], + "global": [], + "http_listener": [ + { + "custom_error_configuration": [], + "firewall_policy_id": "", + "frontend_ip_configuration_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/frontendIPConfigurations/appgw-frontend-ip", + "frontend_ip_configuration_name": "appgw-frontend-ip", + "frontend_port_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/frontendPorts/http", + "frontend_port_name": "http", + "host_name": "", + "host_names": [], + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/httpListeners/listener-http", + "name": "listener-http", + "protocol": "Http", + "require_sni": false, + "ssl_certificate_id": "", + "ssl_certificate_name": "", + "ssl_profile_id": "", + "ssl_profile_name": "" + } + ], + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier", + "identity": [], + "location": "australiaeast", + "name": "appgw-3tier", + "private_endpoint_connection": [], + "private_link_configuration": [], + "probe": [ + { + "host": "", + "id": "", + "interval": 30, + "match": [ + { + "body": "", + "status_code": [ + "200-399" + ] + } + ], + "minimum_servers": 0, + "name": "health-probe", + "path": "/actuator/health", + "pick_host_name_from_backend_http_settings": false, + "port": 80, + "protocol": "Http", + "timeout": 30, + "unhealthy_threshold": 3 + } + ], + "redirect_configuration": [], + "request_routing_rule": [ + { + "backend_address_pool_id": "", + "backend_address_pool_name": "", + "backend_http_settings_id": "", + "backend_http_settings_name": "", + "http_listener_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/httpListeners/listener-http", + "http_listener_name": "listener-http", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/requestRoutingRules/rule", + "name": "rule", + "priority": 100, + "redirect_configuration_id": "", + "redirect_configuration_name": "", + "rewrite_rule_set_id": "", + "rewrite_rule_set_name": "", + "rule_type": "PathBasedRouting", + "url_path_map_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/urlPathMaps/urlmap", + "url_path_map_name": "urlmap" + } + ], + "resource_group_name": "rg-3tier", + "rewrite_rule_set": [], + "sku": [ + { + "capacity": 2, + "name": "WAF_v2", + "tier": "WAF_v2" + } + ], + "ssl_certificate": [], + "ssl_policy": [ + { + "cipher_suites": [], + "disabled_protocols": [], + "min_protocol_version": "", + "policy_name": "AppGwSslPolicy20170401S", + "policy_type": "Predefined" + } + ], + "ssl_profile": [], + "tags": {}, + "timeouts": null, + "trusted_client_certificate": [], + "trusted_root_certificate": [], + "url_path_map": [ + { + "default_backend_address_pool_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/backendAddressPools/frontend-pool", + "default_backend_address_pool_name": "frontend-pool", + "default_backend_http_settings_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/backendHttpSettingsCollection/http-settings-frontend", + "default_backend_http_settings_name": "http-settings", + "default_redirect_configuration_id": "", + "default_redirect_configuration_name": "", + "default_rewrite_rule_set_id": "", + "default_rewrite_rule_set_name": "", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/urlPathMaps/urlmap", + "name": "urlmap", + "path_rule": [ + { + "backend_address_pool_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/backendAddressPools/backend-pool", + "backend_address_pool_name": "backend-pool", + "backend_http_settings_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/backendHttpSettingsCollection/http-settings", + "backend_http_settings_name": "http-settings", + "firewall_policy_id": "", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/applicationGateways/appgw-3tier/urlPathMaps/urlmap/pathRules/api-rule", + "name": "api-rule", + "paths": [ + "/api/*" + ], + "redirect_configuration_id": "", + "redirect_configuration_name": "", + "rewrite_rule_set_id": "", + "rewrite_rule_set_name": "" + } + ] + } + ], + "waf_configuration": [ + { + "disabled_rule_group": [], + "enabled": true, + "exclusion": [], + "file_upload_limit_mb": 100, + "firewall_mode": "Prevention", + "max_request_body_size_kb": 128, + "request_body_check": true, + "rule_set_type": "OWASP", + "rule_set_version": "3.2" + } + ], + "zones": [] + }, + "sensitive_attributes": [], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo1NDAwMDAwMDAwMDAwLCJkZWxldGUiOjU0MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjo1NDAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.appgw.azurerm_public_ip.pip", + "module.containerapps.azurerm_container_app.backend", + "module.containerapps.azurerm_container_app.frontend", + "module.containerapps.azurerm_container_app_environment.env", + "module.network.azurerm_resource_group.rg", + "module.network.azurerm_subnet.aca_env_subnet", + "module.network.azurerm_subnet.appgw_subnet", + "module.network.azurerm_virtual_network.vnet", + "module.sql.azurerm_mssql_database.db", + "module.sql.azurerm_mssql_server.sql" + ] + } + ] + }, + { + "module": "module.appgw", + "mode": "managed", + "type": "azurerm_public_ip", + "name": "pip", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "allocation_method": "Static", + "ddos_protection_mode": "VirtualNetworkInherited", + "ddos_protection_plan_id": null, + "domain_name_label": null, + "edge_zone": "", + "fqdn": null, + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/publicIPAddresses/appgw-pip", + "idle_timeout_in_minutes": 4, + "ip_address": "68.218.101.131", + "ip_tags": {}, + "ip_version": "IPv4", + "location": "australiaeast", + "name": "appgw-pip", + "public_ip_prefix_id": null, + "resource_group_name": "rg-3tier", + "reverse_fqdn": null, + "sku": "Standard", + "sku_tier": "Regional", + "tags": {}, + "timeouts": null, + "zones": [] + }, + "sensitive_attributes": [], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg" + ] + } + ] + }, + { + "module": "module.containerapps", + "mode": "managed", + "type": "azurerm_container_app", + "name": "backend", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "container_app_environment_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.App/managedEnvironments/aca-a40c7601-env", + "custom_domain_verification_id": "C5629A918A3FA55FF147545881A75721689136F00C9C862C48493941404CBD3C", + "dapr": [], + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.App/containerApps/a40c7601-backend-app", + "identity": [], + "ingress": [ + { + "allow_insecure_connections": false, + "custom_domain": [], + "exposed_port": 0, + "external_enabled": false, + "fqdn": "a40c7601-backend-app.internal.redbush-51cb9b9d.australiaeast.azurecontainerapps.io", + "ip_security_restriction": [], + "target_port": 8080, + "traffic_weight": [ + { + "label": "", + "latest_revision": true, + "percentage": 100, + "revision_suffix": "" + } + ], + "transport": "http" + } + ], + "latest_revision_fqdn": "a40c7601-backend-app--0000059.internal.redbush-51cb9b9d.australiaeast.azurecontainerapps.io", + "latest_revision_name": "a40c7601-backend-app--0000059", + "location": "australiaeast", + "name": "a40c7601-backend-app", + "outbound_ip_addresses": [ + "4.237.144.250" + ], + "registry": [], + "resource_group_name": "rg-3tier", + "revision_mode": "Single", + "secret": [], + "tags": {}, + "template": [ + { + "azure_queue_scale_rule": [], + "container": [ + { + "args": [], + "command": [], + "cpu": 0.5, + "env": [ + { + "name": "DB_HOST", + "secret_name": "", + "value": "3tier-sqlserver.database.windows.net" + }, + { + "name": "SPRING_DATASOURCE_URL", + "secret_name": "", + "value": "jdbc:sqlserver://3tier-sqlserver.database.windows.net:1433;database=3tier-db;encrypt=true;trustServerCertificate=false;loginTimeout=30;" + }, + { + "name": "SPRING_DATASOURCE_USERNAME", + "secret_name": "", + "value": "yousefaloufi1@3tier-sqlserver" + }, + { + "name": "SPRING_DATASOURCE_PASSWORD", + "secret_name": "", + "value": "P@ssword1234!" + }, + { + "name": "DB_NAME", + "secret_name": "", + "value": "3tier-db" + }, + { + "name": "DB_USERNAME", + "secret_name": "", + "value": "yousefaloufi1@3tier-sqlserver" + }, + { + "name": "DB_PASSWORD", + "secret_name": "", + "value": "P@ssword1234!" + } + ], + "ephemeral_storage": "2Gi", + "image": "yousefaloufi6/backend-app:latest", + "liveness_probe": [], + "memory": "1Gi", + "name": "backend", + "readiness_probe": [], + "startup_probe": [], + "volume_mounts": [] + } + ], + "custom_scale_rule": [], + "http_scale_rule": [], + "init_container": [], + "max_replicas": 10, + "min_replicas": 0, + "revision_suffix": "", + "tcp_scale_rule": [], + "volume": [] + } + ], + "timeouts": null, + "workload_profile_name": "" + }, + "sensitive_attributes": [ + [ + { + "type": "get_attr", + "value": "custom_domain_verification_id" + } + ] + ], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.containerapps.azurerm_container_app_environment.env", + "module.network.azurerm_resource_group.rg", + "module.network.azurerm_subnet.aca_env_subnet", + "module.network.azurerm_virtual_network.vnet", + "module.sql.azurerm_mssql_database.db", + "module.sql.azurerm_mssql_server.sql" + ] + } + ] + }, + { + "module": "module.containerapps", + "mode": "managed", + "type": "azurerm_container_app", + "name": "frontend", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "container_app_environment_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.App/managedEnvironments/aca-a40c7601-env", + "custom_domain_verification_id": "C5629A918A3FA55FF147545881A75721689136F00C9C862C48493941404CBD3C", + "dapr": [], + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.App/containerApps/a40c7601-frontend-app", + "identity": [], + "ingress": [ + { + "allow_insecure_connections": false, + "custom_domain": [], + "exposed_port": 0, + "external_enabled": false, + "fqdn": "a40c7601-frontend-app.internal.redbush-51cb9b9d.australiaeast.azurecontainerapps.io", + "ip_security_restriction": [], + "target_port": 80, + "traffic_weight": [ + { + "label": "", + "latest_revision": true, + "percentage": 100, + "revision_suffix": "" + } + ], + "transport": "http" + } + ], + "latest_revision_fqdn": "a40c7601-frontend-app--0000009.internal.redbush-51cb9b9d.australiaeast.azurecontainerapps.io", + "latest_revision_name": "a40c7601-frontend-app--0000009", + "location": "australiaeast", + "name": "a40c7601-frontend-app", + "outbound_ip_addresses": [ + "4.237.144.250" + ], + "registry": [], + "resource_group_name": "rg-3tier", + "revision_mode": "Single", + "secret": [], + "tags": {}, + "template": [ + { + "azure_queue_scale_rule": [], + "container": [ + { + "args": [], + "command": [], + "cpu": 0.5, + "env": [], + "ephemeral_storage": "2Gi", + "image": "yousefaloufi6/frontend-app:latest", + "liveness_probe": [], + "memory": "1Gi", + "name": "frontend", + "readiness_probe": [], + "startup_probe": [], + "volume_mounts": [] + } + ], + "custom_scale_rule": [], + "http_scale_rule": [], + "init_container": [], + "max_replicas": 10, + "min_replicas": 0, + "revision_suffix": "", + "tcp_scale_rule": [], + "volume": [] + } + ], + "timeouts": null, + "workload_profile_name": "" + }, + "sensitive_attributes": [ + [ + { + "type": "get_attr", + "value": "custom_domain_verification_id" + } + ] + ], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.containerapps.azurerm_container_app_environment.env", + "module.network.azurerm_resource_group.rg", + "module.network.azurerm_subnet.aca_env_subnet", + "module.network.azurerm_virtual_network.vnet" + ] + } + ] + }, + { + "module": "module.containerapps", + "mode": "managed", + "type": "azurerm_container_app_environment", + "name": "env", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "index_key": 0, + "schema_version": 0, + "attributes": { + "custom_domain_verification_id": "C5629A918A3FA55FF147545881A75721689136F00C9C862C48493941404CBD3C", + "dapr_application_insights_connection_string": "", + "default_domain": "redbush-51cb9b9d.australiaeast.azurecontainerapps.io", + "docker_bridge_cidr": "", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.App/managedEnvironments/aca-a40c7601-env", + "infrastructure_resource_group_name": "", + "infrastructure_subnet_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet/subnets/snet-aca-env", + "internal_load_balancer_enabled": true, + "location": "australiaeast", + "log_analytics_workspace_id": "", + "mutual_tls_enabled": false, + "name": "aca-a40c7601-env", + "platform_reserved_cidr": "10.0.0.0/16", + "platform_reserved_dns_ip_address": "10.0.0.2", + "resource_group_name": "rg-3tier", + "static_ip_address": "10.10.2.62", + "tags": {}, + "timeouts": null, + "workload_profile": [], + "zone_redundancy_enabled": false + }, + "sensitive_attributes": [ + [ + { + "type": "get_attr", + "value": "dapr_application_insights_connection_string" + } + ] + ], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg", + "module.network.azurerm_subnet.aca_env_subnet", + "module.network.azurerm_virtual_network.vnet" + ] + } + ] + }, + { + "module": "module.monitoring", + "mode": "managed", + "type": "azurerm_application_insights", + "name": "ai_backend", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 2, + "attributes": { + "app_id": "b348da4c-7037-4af9-8325-03d87a6ee089", + "application_type": "web", + "connection_string": "InstrumentationKey=435facd8-b245-470c-9e7d-124ecfb822ff;IngestionEndpoint=https://australiaeast-1.in.applicationinsights.azure.com/;LiveEndpoint=https://australiaeast.livediagnostics.monitor.azure.com/;ApplicationId=b348da4c-7037-4af9-8325-03d87a6ee089", + "daily_data_cap_in_gb": 100, + "daily_data_cap_notifications_disabled": false, + "disable_ip_masking": false, + "force_customer_storage_for_profiler": false, + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Insights/components/3tier-ai-backend", + "instrumentation_key": "435facd8-b245-470c-9e7d-124ecfb822ff", + "internet_ingestion_enabled": true, + "internet_query_enabled": true, + "local_authentication_disabled": false, + "location": "australiaeast", + "name": "3tier-ai-backend", + "resource_group_name": "rg-3tier", + "retention_in_days": 90, + "sampling_percentage": 100, + "tags": {}, + "timeouts": null, + "workspace_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.OperationalInsights/workspaces/3tier-law" + }, + "sensitive_attributes": [ + [ + { + "type": "get_attr", + "value": "connection_string" + } + ], + [ + { + "type": "get_attr", + "value": "instrumentation_key" + } + ] + ], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozNjAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfSwic2NoZW1hX3ZlcnNpb24iOiIyIn0=", + "dependencies": [ + "module.monitoring.azurerm_log_analytics_workspace.law", + "module.network.azurerm_resource_group.rg" + ] + } + ] + }, + { + "module": "module.monitoring", + "mode": "managed", + "type": "azurerm_application_insights", + "name": "ai_frontend", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 2, + "attributes": { + "app_id": "15e81722-d5da-4712-a707-b0fd348ebd46", + "application_type": "web", + "connection_string": "InstrumentationKey=c2545d78-c524-4f39-a19d-49910b419a91;IngestionEndpoint=https://australiaeast-1.in.applicationinsights.azure.com/;LiveEndpoint=https://australiaeast.livediagnostics.monitor.azure.com/;ApplicationId=15e81722-d5da-4712-a707-b0fd348ebd46", + "daily_data_cap_in_gb": 100, + "daily_data_cap_notifications_disabled": false, + "disable_ip_masking": false, + "force_customer_storage_for_profiler": false, + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Insights/components/3tier-ai-frontend", + "instrumentation_key": "c2545d78-c524-4f39-a19d-49910b419a91", + "internet_ingestion_enabled": true, + "internet_query_enabled": true, + "local_authentication_disabled": false, + "location": "australiaeast", + "name": "3tier-ai-frontend", + "resource_group_name": "rg-3tier", + "retention_in_days": 90, + "sampling_percentage": 100, + "tags": {}, + "timeouts": null, + "workspace_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.OperationalInsights/workspaces/3tier-law" + }, + "sensitive_attributes": [ + [ + { + "type": "get_attr", + "value": "connection_string" + } + ], + [ + { + "type": "get_attr", + "value": "instrumentation_key" + } + ] + ], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozNjAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfSwic2NoZW1hX3ZlcnNpb24iOiIyIn0=", + "dependencies": [ + "module.monitoring.azurerm_log_analytics_workspace.law", + "module.network.azurerm_resource_group.rg" + ] + } + ] + }, + { + "module": "module.monitoring", + "mode": "managed", + "type": "azurerm_log_analytics_workspace", + "name": "law", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 3, + "attributes": { + "allow_resource_only_permissions": true, + "cmk_for_query_forced": false, + "daily_quota_gb": -1, + "data_collection_rule_id": "", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.OperationalInsights/workspaces/3tier-law", + "identity": [], + "immediate_data_purge_on_30_days_enabled": false, + "internet_ingestion_enabled": true, + "internet_query_enabled": true, + "local_authentication_disabled": false, + "location": "australiaeast", + "name": "3tier-law", + "primary_shared_key": "9RlFuCcouHRz/JAWox6DXkJxxpRET9uFGmEMA06o1MDcVBx1TsA8932UNYSFDWtWayT7mdzEk8I+tAu6V+O1QQ==", + "reservation_capacity_in_gb_per_day": null, + "resource_group_name": "rg-3tier", + "retention_in_days": 30, + "secondary_shared_key": "2tS3RJSsqu7DFzRczSRLlcjqhXzOfbDca/4FudqEjbgWK/nstvkcJH8Y45agkvkkj+nvev99MJt3/XvJ8H0oag==", + "sku": "PerGB2018", + "tags": {}, + "timeouts": null, + "workspace_id": "706f8c86-e280-445f-b34c-f0b67a18e2f3" + }, + "sensitive_attributes": [ + [ + { + "type": "get_attr", + "value": "primary_shared_key" + } + ], + [ + { + "type": "get_attr", + "value": "secondary_shared_key" + } + ] + ], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfSwic2NoZW1hX3ZlcnNpb24iOiIzIn0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg" + ] + } + ] + }, + { + "module": "module.network", + "mode": "managed", + "type": "azurerm_resource_group", + "name": "rg", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier", + "location": "australiaeast", + "managed_by": "", + "name": "rg-3tier", + "tags": {}, + "timeouts": null + }, + "sensitive_attributes": [], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo1NDAwMDAwMDAwMDAwLCJkZWxldGUiOjU0MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjo1NDAwMDAwMDAwMDAwfX0=" + } + ] + }, + { + "module": "module.network", + "mode": "managed", + "type": "azurerm_subnet", + "name": "aca_env_subnet", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "address_prefixes": [ + "10.10.2.0/23" + ], + "default_outbound_access_enabled": true, + "delegation": [], + "enforce_private_link_endpoint_network_policies": false, + "enforce_private_link_service_network_policies": false, + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet/subnets/snet-aca-env", + "name": "snet-aca-env", + "private_endpoint_network_policies": "Enabled", + "private_endpoint_network_policies_enabled": true, + "private_link_service_network_policies_enabled": true, + "resource_group_name": "rg-3tier", + "service_endpoint_policy_ids": [], + "service_endpoints": [], + "timeouts": null, + "virtual_network_name": "3tier-vnet" + }, + "sensitive_attributes": [], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg", + "module.network.azurerm_virtual_network.vnet" + ] + } + ] + }, + { + "module": "module.network", + "mode": "managed", + "type": "azurerm_subnet", + "name": "appgw_subnet", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "address_prefixes": [ + "10.10.1.0/24" + ], + "default_outbound_access_enabled": true, + "delegation": [], + "enforce_private_link_endpoint_network_policies": false, + "enforce_private_link_service_network_policies": false, + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet/subnets/snet-appgw", + "name": "snet-appgw", + "private_endpoint_network_policies": "Enabled", + "private_endpoint_network_policies_enabled": true, + "private_link_service_network_policies_enabled": true, + "resource_group_name": "rg-3tier", + "service_endpoint_policy_ids": [], + "service_endpoints": [], + "timeouts": null, + "virtual_network_name": "3tier-vnet" + }, + "sensitive_attributes": [], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg", + "module.network.azurerm_virtual_network.vnet" + ] + } + ] + }, + { + "module": "module.network", + "mode": "managed", + "type": "azurerm_subnet", + "name": "db_pe_subnet", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "address_prefixes": [ + "10.10.4.0/24" + ], + "default_outbound_access_enabled": true, + "delegation": [], + "enforce_private_link_endpoint_network_policies": true, + "enforce_private_link_service_network_policies": false, + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet/subnets/snet-db-pe", + "name": "snet-db-pe", + "private_endpoint_network_policies": "Disabled", + "private_endpoint_network_policies_enabled": false, + "private_link_service_network_policies_enabled": true, + "resource_group_name": "rg-3tier", + "service_endpoint_policy_ids": [], + "service_endpoints": [], + "timeouts": null, + "virtual_network_name": "3tier-vnet" + }, + "sensitive_attributes": [], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg", + "module.network.azurerm_virtual_network.vnet" + ] + } + ] + }, + { + "module": "module.network", + "mode": "managed", + "type": "azurerm_subnet", + "name": "ops_subnet", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "address_prefixes": [ + "10.10.5.0/24" + ], + "default_outbound_access_enabled": true, + "delegation": [], + "enforce_private_link_endpoint_network_policies": false, + "enforce_private_link_service_network_policies": false, + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet/subnets/snet-ops", + "name": "snet-ops", + "private_endpoint_network_policies": "Enabled", + "private_endpoint_network_policies_enabled": true, + "private_link_service_network_policies_enabled": true, + "resource_group_name": "rg-3tier", + "service_endpoint_policy_ids": [], + "service_endpoints": [], + "timeouts": null, + "virtual_network_name": "3tier-vnet" + }, + "sensitive_attributes": [], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg", + "module.network.azurerm_virtual_network.vnet" + ] + } + ] + }, + { + "module": "module.network", + "mode": "managed", + "type": "azurerm_virtual_network", + "name": "vnet", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "address_space": [ + "10.10.0.0/16" + ], + "bgp_community": "", + "ddos_protection_plan": [], + "dns_servers": [], + "edge_zone": "", + "encryption": [], + "flow_timeout_in_minutes": 0, + "guid": "3d7c7dc7-ae88-46c0-a4e1-8c3f15acdd32", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet", + "location": "australiaeast", + "name": "3tier-vnet", + "resource_group_name": "rg-3tier", + "subnet": [ + { + "address_prefix": "10.10.1.0/24", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet/subnets/snet-appgw", + "name": "snet-appgw", + "security_group": "" + }, + { + "address_prefix": "10.10.2.0/23", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet/subnets/snet-aca-env", + "name": "snet-aca-env", + "security_group": "" + }, + { + "address_prefix": "10.10.4.0/24", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet/subnets/snet-db-pe", + "name": "snet-db-pe", + "security_group": "" + }, + { + "address_prefix": "10.10.5.0/24", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet/subnets/snet-ops", + "name": "snet-ops", + "security_group": "" + } + ], + "tags": {}, + "timeouts": null + }, + "sensitive_attributes": [], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg" + ] + } + ] + }, + { + "module": "module.sql", + "mode": "managed", + "type": "azurerm_mssql_database", + "name": "db", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 1, + "attributes": { + "auto_pause_delay_in_minutes": 0, + "collation": "SQL_Latin1_General_CP1_CI_AS", + "create_mode": "Default", + "creation_source_database_id": null, + "elastic_pool_id": "", + "enclave_type": "", + "geo_backup_enabled": true, + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Sql/servers/3tier-sqlserver/databases/3tier-db", + "identity": [], + "import": [], + "ledger_enabled": false, + "license_type": "", + "long_term_retention_policy": [ + { + "immutable_backups_enabled": false, + "monthly_retention": "PT0S", + "week_of_year": 1, + "weekly_retention": "PT0S", + "yearly_retention": "PT0S" + } + ], + "maintenance_configuration_name": "SQL_Default", + "max_size_gb": 250, + "min_capacity": 0, + "name": "3tier-db", + "read_replica_count": 0, + "read_scale": false, + "recover_database_id": null, + "recovery_point_id": null, + "restore_dropped_database_id": null, + "restore_long_term_retention_backup_id": null, + "restore_point_in_time": null, + "sample_name": null, + "secondary_type": "", + "server_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Sql/servers/3tier-sqlserver", + "short_term_retention_policy": [ + { + "backup_interval_in_hours": 24, + "retention_days": 7 + } + ], + "sku_name": "S0", + "storage_account_type": "Geo", + "tags": {}, + "threat_detection_policy": [ + { + "disabled_alerts": [], + "email_account_admins": "Disabled", + "email_addresses": [], + "retention_days": 0, + "state": "Disabled", + "storage_account_access_key": "", + "storage_endpoint": "" + } + ], + "timeouts": null, + "transparent_data_encryption_enabled": true, + "transparent_data_encryption_key_automatic_rotation_enabled": false, + "transparent_data_encryption_key_vault_key_id": "", + "zone_redundant": false + }, + "sensitive_attributes": [ + [ + { + "type": "get_attr", + "value": "threat_detection_policy" + }, + { + "type": "index", + "value": { + "value": 0, + "type": "number" + } + }, + { + "type": "get_attr", + "value": "storage_account_access_key" + } + ] + ], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozNjAwMDAwMDAwMDAwLCJkZWxldGUiOjM2MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjozNjAwMDAwMDAwMDAwfSwic2NoZW1hX3ZlcnNpb24iOiIxIn0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg", + "module.sql.azurerm_mssql_server.sql" + ] + } + ] + }, + { + "module": "module.sql", + "mode": "managed", + "type": "azurerm_mssql_server", + "name": "sql", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "administrator_login": "sqladmin", + "administrator_login_password": "P@ssword1234!", + "azuread_administrator": [], + "connection_policy": "Default", + "fully_qualified_domain_name": "3tier-sqlserver.database.windows.net", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Sql/servers/3tier-sqlserver", + "identity": [], + "location": "australiaeast", + "minimum_tls_version": "1.2", + "name": "3tier-sqlserver", + "outbound_network_restriction_enabled": false, + "primary_user_assigned_identity_id": "", + "public_network_access_enabled": true, + "resource_group_name": "rg-3tier", + "restorable_dropped_database_ids": [], + "tags": {}, + "timeouts": null, + "transparent_data_encryption_key_vault_key_id": "", + "version": "12.0" + }, + "sensitive_attributes": [ + [ + { + "type": "get_attr", + "value": "administrator_login_password" + } + ] + ], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozNjAwMDAwMDAwMDAwLCJkZWxldGUiOjM2MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjozNjAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg" + ] + } + ] + }, + { + "module": "module.sql", + "mode": "managed", + "type": "azurerm_private_dns_zone", + "name": "sql", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/privateDnsZones/privatelink.database.windows.net", + "max_number_of_record_sets": 25000, + "max_number_of_virtual_network_links": 1000, + "max_number_of_virtual_network_links_with_registration": 100, + "name": "privatelink.database.windows.net", + "number_of_record_sets": 3, + "resource_group_name": "rg-3tier", + "soa_record": [ + { + "email": "azureprivatedns-host.microsoft.com", + "expire_time": 2419200, + "fqdn": "privatelink.database.windows.net.", + "host_name": "azureprivatedns.net", + "minimum_ttl": 10, + "refresh_time": 3600, + "retry_time": 300, + "serial_number": 1, + "tags": {}, + "ttl": 3600 + } + ], + "tags": {}, + "timeouts": null + }, + "sensitive_attributes": [], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg" + ] + } + ] + }, + { + "module": "module.sql", + "mode": "managed", + "type": "azurerm_private_dns_zone_virtual_network_link", + "name": "link", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/privateDnsZones/privatelink.database.windows.net/virtualNetworkLinks/sql-link", + "name": "sql-link", + "private_dns_zone_name": "privatelink.database.windows.net", + "registration_enabled": false, + "resource_group_name": "rg-3tier", + "tags": {}, + "timeouts": null, + "virtual_network_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet" + }, + "sensitive_attributes": [], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg", + "module.network.azurerm_virtual_network.vnet", + "module.sql.azurerm_private_dns_zone.sql" + ] + } + ] + }, + { + "module": "module.sql", + "mode": "managed", + "type": "azurerm_private_endpoint", + "name": "sql_pe", + "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "custom_dns_configs": [ + { + "fqdn": "3tier-sqlserver.database.windows.net", + "ip_addresses": [ + "10.10.4.4" + ] + } + ], + "custom_network_interface_name": "", + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/privateEndpoints/sql-pe", + "ip_configuration": [], + "location": "australiaeast", + "name": "sql-pe", + "network_interface": [ + { + "id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/networkInterfaces/sql-pe.nic.8c18da78-1f1f-4cd6-b2eb-a33af09cd2ca", + "name": "sql-pe.nic.8c18da78-1f1f-4cd6-b2eb-a33af09cd2ca" + } + ], + "private_dns_zone_configs": [], + "private_dns_zone_group": [], + "private_service_connection": [ + { + "is_manual_connection": false, + "name": "sql-pe-conn", + "private_connection_resource_alias": "", + "private_connection_resource_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Sql/servers/3tier-sqlserver", + "private_ip_address": "10.10.4.4", + "request_message": "", + "subresource_names": [ + "sqlServer" + ] + } + ], + "resource_group_name": "rg-3tier", + "subnet_id": "/subscriptions/4421688c-0a8d-4588-8dd0-338c5271d0af/resourceGroups/rg-3tier/providers/Microsoft.Network/virtualNetworks/3tier-vnet/subnets/snet-db-pe", + "tags": {}, + "timeouts": null + }, + "sensitive_attributes": [], + "identity_schema_version": 0, + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozNjAwMDAwMDAwMDAwLCJkZWxldGUiOjM2MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjozNjAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "module.network.azurerm_resource_group.rg", + "module.network.azurerm_subnet.db_pe_subnet", + "module.network.azurerm_virtual_network.vnet", + "module.sql.azurerm_mssql_server.sql" + ] + } + ] + } + ], + "check_results": null +}