From db9e0dc45991ed815bd2dc2daad803f185a8adce Mon Sep 17 00:00:00 2001 From: Bryce Date: Wed, 25 Sep 2024 22:01:12 -0700 Subject: [PATCH] makes solr ec2 based and adds resiliency to running balances. --- config/prod.edn | 2 +- resources/schema.edn | 1 + src/clj/auto_ap/datomic.clj | 25 + src/clj/auto_ap/import/plaid.clj | 3 +- src/clj/auto_ap/ledger.clj | 183 ++++--- src/clj/auto_ap/ssr/ledger.clj | 4 +- .../prod/terraform.tfstate | 397 +++++++++++++- .../prod/terraform.tfstate.backup | 493 ++++++++++++++++-- 8 files changed, 977 insertions(+), 131 deletions(-) diff --git a/config/prod.edn b/config/prod.edn index 6629a8cd..fddf07c8 100644 --- a/config/prod.edn +++ b/config/prod.edn @@ -1,7 +1,7 @@ {:db {:server "database"} :datomic-url "datomic:ddb://us-east-1/integreat/integreat-prod" :base-url "https://app.integreatconsult.com" - :solr-uri "http://solr-prod.local:8983" + :solr-uri "http://solr-ec2-prod.local:8983" :solr-impl :solr :scheme "https" :dd-env "prod" diff --git a/resources/schema.edn b/resources/schema.edn index 579a2545..158f241f 100644 --- a/resources/schema.edn +++ b/resources/schema.edn @@ -667,6 +667,7 @@ :db/cardinality :db.cardinality/one :db/doc "Last time Quickbooks updated", :db/ident :intuit-bank-account/last-synced} +{:db/ident :unknown-account} {:db/unique #:db{:ident :db.unique/identity}, :db/valueType #:db{:ident :db.type/long}, diff --git a/src/clj/auto_ap/datomic.clj b/src/clj/auto_ap/datomic.clj index e5516ac0..e70bc375 100644 --- a/src/clj/auto_ap/datomic.clj +++ b/src/clj/auto_ap/datomic.clj @@ -622,6 +622,31 @@ (range length)))] (sort comparator results))) +;; TODO replace COULD JUST BE SORT-3 +(defn apply-sort-4 [args results] + + (let [sort-bys (-> [] + (into (:sort args)) + (conj {:sort-key "default" :asc (if (contains? args :default-asc?) + (:default-asc? args) + true)}) + (conj {:sort-key "e" :asc true})) + length (count sort-bys) + comparator (fn [xs ys] + (reduce + (fn [_ i] + + (let [comparison (if (:asc (nth sort-bys i)) + (compare (nth xs i) (nth ys i)) + (compare (nth ys i) (nth xs i)))] + + (if (not= 0 comparison) + (reduced comparison) + 0))) + 0 + (range length)))] + (sort comparator results))) + (defn apply-pagination-raw [args results] {:entries (->> results (drop (or (:start args) 0)) diff --git a/src/clj/auto_ap/import/plaid.clj b/src/clj/auto_ap/import/plaid.clj index dcffb3fa..d77223fc 100644 --- a/src/clj/auto_ap/import/plaid.clj +++ b/src/clj/auto_ap/import/plaid.clj @@ -95,8 +95,7 @@ (for [a (:accounts accounts)] (remove-nils {:plaid-account/external-id (:account_id a) - :plaid-account/last-synced (coerce/to-date (coerce/to-date-time (-> item :status :transactions :last_successful_update))) - :plaid-account/balance (or (some-> a + :plaid-account/last-synced (coerce/to-date (coerce/to-date-time (-> item :status :transactions :last_successful_update))) :plaid-account/balance (or (some-> a :balances :current double) diff --git a/src/clj/auto_ap/ledger.clj b/src/clj/auto_ap/ledger.clj index 70d7d3b3..391da7f6 100644 --- a/src/clj/auto_ap/ledger.clj +++ b/src/clj/auto_ap/ledger.clj @@ -2,6 +2,7 @@ (:require [auto-ap.datomic :refer [conn pull-id pull-ref transact-with-backoff]] [auto-ap.utils :refer [by dollars= heartbeat]] + [auto-ap.logging :as alog] [clj-time.coerce :as c] [clj-time.core :as t] [com.brunobonacci.mulog :as mu] @@ -324,7 +325,9 @@ ({:bank-account-type/check :account-type/asset :bank-account-type/cash :account-type/asset :bank-account-type/credit :account-type/liability} - (:db/ident (:bank-account/type (bank-accounts a))))) + (:db/ident (:bank-account/type (bank-accounts a)))) + :account-type/asset ;; DEFAULT TO ASSET, for things like unknown + ) :numeric_code (or (:account/numeric-code (accounts a)) (:bank-account/numeric-code (bank-accounts a))) :client_id client-id}))) @@ -394,120 +397,134 @@ (do (println (count a)) (count a))))) - - (defn accounts-needing-rebuild [ db client] (let [client (pull-id db client)] - (->> (dc/qseq {:query '[:find ?c ?a ?l (min ?d) + (->> (dc/qseq {:query '[:find ?c ?a ?l :in $ $recent ?c :where [$recent ?jel :journal-entry-line/dirty true] - [?jel :journal-entry-line/account ?a] - [?jel :journal-entry-line/location ?l] [?je :journal-entry/line-items ?jel] [?je :journal-entry/client ?c] - [?je :journal-entry/date ?d]] + [(get-else $ ?jel :journal-entry-line/account :unknown-account) ?a] + [(get-else $ ?jel :journal-entry-line/location "Unknown") ?l]] :args [db (dc/since db (c/to-date (t/plus (t/now) (t/hours -8)))) client]}) - (map (fn [[client account location starting-at ]] + (map (fn [[client account location]] {:client client :account account - :starting-at starting-at :location location}))))) (defn all-accounts-needing-rebuild [ db client] (let [client (pull-id db client)] - (->> (dc/qseq {:query '[:find ?c ?a ?l (min ?d) + (->> (dc/qseq {:query '[:find ?c ?a ?l :in $ ?c :where [?je :journal-entry/client ?c] [?je :journal-entry/line-items ?jel] - [?jel :journal-entry-line/account ?a] - [?jel :journal-entry-line/location ?l] - [?je :journal-entry/date ?d]] + [(get-else $ ?jel :journal-entry-line/account :unknown-account) ?a] + [(get-else $ ?jel :journal-entry-line/location "Unknown") ?l] ] :args [db client]}) - (map (fn [[client account location starting-at ]] + (map (fn [[client account location ]] {:client client :account account - :starting-at starting-at :location location}))))) -(defn find-running-balance-start [{:keys [client account location starting-at]} db ] +(defn get-entries-to-refresh [{:keys [client account location]} db ] (let [client (pull-id db client) - account (pull-id db account)] - (or - (->> (dc/index-pull db - {:index :avet - :selector [:db/id :journal-entry-line/running-balance :journal-entry-line/client+account+location+date] - :start [:journal-entry-line/client+account+location+date [client account location starting-at]] - :reverse true}) - (take-while (fn [result] - (= [client - account - location] - (take 3 (:journal-entry-line/client+account+location+date result))))) - (take 5) - (drop-while (fn [{[_ _ _ date] :journal-entry-line/client+account+location+date}] - (>= (compare date starting-at) 0))) - first - :journal-entry-line/running-balance) - 0.0))) + account-id (if (= :unknown-account account) + nil + (pull-id db account)) + matching-location (if (= "Unknown" location) + nil + location)] -(defn get-dirty-entries [{:keys [client account location starting-at]} db ] - (let [client (pull-id db client) - account (pull-id db account)] (into [] (comp (take-while (fn [{[result-client result-account result-location] :journal-entry-line/client+account+location+date}] (and (= client result-client) - (= account result-account) - (= location result-location)))) + (= account-id result-account) + (= matching-location result-location)))) (map (fn [result] - [(:db/id result) (:journal-entry-line/debit result 0.0) (:journal-entry-line/credit result 0.0) ]))) + [(:db/id result) (:journal-entry-line/debit result 0.0) (:journal-entry-line/credit result 0.0) (:journal-entry-line/running-balance result 0.0) (:journal-entry-line/dirty result)]))) (dc/index-pull db {:index :avet - :selector [:db/id :journal-entry-line/debit :journal-entry-line/credit :journal-entry-line/client+account+location+date] + :selector [:db/id :journal-entry-line/debit :journal-entry-line/credit :journal-entry-line/client+account+location+date :journal-entry-line/running-balance :journal-entry-line/dirty] :start [:journal-entry-line/client+account+location+date - [client account location starting-at]] - - })))) + [client + account-id + matching-location + #inst "0001-01-01" ]] })))) (defn compute-running-balance [account-needing-refresh] (mu/trace ::compute [:dirty-count (count (:dirty-entries account-needing-refresh))] + (when (= 0 (count (:dirty-entries account-needing-refresh))) + (alog/warn ::no-entries-to-compute + :message "This typically means that an account is determined to be dirty, but no entries are found, meaning bad query")) (second (reduce - (fn [[running-balance rows] [id debit credit] ] + (fn [[running-balance changed-rows] [id debit credit extant-running-balance dirty] ] (let [new-running-balance (+ running-balance (if (#{:account-type/asset :account-type/dividend :account-type/expense} (:account-type account-needing-refresh)) (- debit credit) - (- credit debit)))] + (- credit debit))) + row-changed? (or (not (dollars= new-running-balance extant-running-balance)) + dirty)] [new-running-balance - (conj rows - {:db/id id - :journal-entry-line/running-balance new-running-balance - :journal-entry-line/dirty false})])) - - [(:build-from account-needing-refresh) []] +(conj changed-rows + {:db/id id + :journal-entry-line/running-balance new-running-balance + :journal-entry-line/debit debit + :journal-entry-line/credit credit + :journal-entry-line/dirty false}) + #_(if row-changed? + (conj changed-rows + {:db/id id + :journal-entry-line/running-balance new-running-balance + :journal-entry-line/debit debit + :journal-entry-line/credit credit + :journal-entry-line/dirty false}) + changed-rows)])) + [0.0 []] (:dirty-entries account-needing-refresh))))) +(let [db (dc/db conn) + account-needing-rebuild + {:account (pull-id (dc/db conn) [:bank-account/code "SCCB-2888CB"]) + :client (pull-id (dc/db conn) [:client/code "SCCB"]) + :location "A"} + + result (-> account-needing-rebuild + (assoc :dirty-entries (get-entries-to-refresh account-needing-rebuild db)) + (assoc :account-type (:account_type ((build-account-lookup (:client account-needing-rebuild)) (:account account-needing-rebuild)))) + (compute-running-balance))] + (alog/info ::recomputed-entries-with-new-sum :count (count result)) + result) (defn refresh-running-balance-accounts [accounts-needing-rebuild clients c i db] + (mu/log ::found-accounts-needing-rebuild :accounts (count accounts-needing-rebuild)) (let [so-far (atom 0)] @(->> accounts-needing-rebuild (s/->source) (s/map (fn [account-needing-rebuild] - (de/future - (mu/with-context {:account account-needing-rebuild} - (-> account-needing-rebuild - (assoc :build-from (find-running-balance-start account-needing-rebuild db)) - (assoc :dirty-entries (get-dirty-entries account-needing-rebuild db)) - (assoc :account-type (:account_type ((build-account-lookup (:client account-needing-rebuild)) (:account account-needing-rebuild)))) - (compute-running-balance)))))) + (-> + (de/future + (mu/with-context {:account account-needing-rebuild} + (let [result (-> account-needing-rebuild + (assoc :dirty-entries (get-entries-to-refresh account-needing-rebuild db)) + (assoc :account-type (:account_type ((build-account-lookup (:client account-needing-rebuild)) (:account account-needing-rebuild)))) + (compute-running-balance))] + (alog/info ::recomputed-entries-with-new-sum :count (count result) ) + result) + )) + (de/catch (fn [error] + (alog/error ::cant-rebuild + :error error) + nil))))) (s/realize-each) (s/mapcat (fn [x] x)) @@ -528,17 +545,21 @@ :client-index i :client-count (count clients))))))) + (defn clients-needing-refresh [] - (map first - (dc/q '[:find (pull ?c [:client/code :db/id]) - :in $ $recent - :where [$recent ?jel :journal-entry-line/dirty true] - [$ ?je :journal-entry/line-items ?jel] - [$ ?je :journal-entry/client ?c]] - (dc/db conn) - (dc/since - (dc/db conn) - (c/to-date (t/plus (t/now) (t/hours -4))))))) + (->> + (dc/q '[:find (pull ?c [:client/code :db/id]) (count ?jel) + :in $ $recent + :where [$recent ?jel :journal-entry-line/dirty true] + [$ ?je :journal-entry/line-items ?jel] + [$ ?je :journal-entry/client ?c] + [$ ?jel :journal-entry-line/dirty true]] + (dc/db conn) + (dc/since + (dc/db conn) + (c/to-date (t/plus (t/now) (t/hours -8))))) + (map (fn [[client outdated]] + (assoc client :dirty-count outdated))))) (defn refresh-running-balance-cache ([] (refresh-running-balance-cache (shuffle (clients-needing-refresh)))) @@ -575,6 +596,30 @@ (refresh-running-balance-accounts accounts-needing-rebuild clients c i db) (mu/log ::client-completed)))))))) +#_(seq (dc/q '[:find ?le ?d + :in $ + :where [?le :journal-entry/date ?d] + [(<= ?d #inst "2000-01-01")]] + (dc/db conn))) + + +#_(comment [17592334354011 #inst "0024-08-03T07:52:58.000-00:00"] + [17592302554688 #inst "0023-07-20T07:52:58.000-00:00"] + [17592302554682 #inst "0023-07-16T07:52:58.000-00:00"] + [17592302554691 #inst "0023-07-22T07:52:58.000-00:00"] + [17592334353995 #inst "0024-08-10T07:52:58.000-00:00"] + [17592302554694 #inst "0023-07-27T07:52:58.000-00:00"] + [17592241669405 #inst "0218-08-04T07:52:58.000-00:00"] + [17592334353207 #inst "0024-07-27T07:52:58.000-00:00"] + [17592302554685 #inst "0023-07-16T07:52:58.000-00:00"] + [17592334353244 #inst "0024-07-14T07:52:58.000-00:00"]) + +;; TODO +;; 1. Having an uncategorized running balance +;; 1a. dirty should always be 0 +;; 2. rebuild from beginning of history always, only update entry if it currently doesn't match +;; 3. deterministic order (date + entityid) + ;; TODO only enable once IOL is set up in clod #_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} (mount/defstate running-balance-cache-worker diff --git a/src/clj/auto_ap/ssr/ledger.clj b/src/clj/auto_ap/ssr/ledger.clj index 97b8c755..e2ceb7d0 100644 --- a/src/clj/auto_ap/ssr/ledger.clj +++ b/src/clj/auto_ap/ssr/ledger.clj @@ -1,7 +1,7 @@ (ns auto-ap.ssr.ledger (:require [auto-ap.client-routes :as client-routes] [auto-ap.datomic - :refer [add-sorter-fields apply-pagination apply-sort-3 + :refer [add-sorter-fields apply-pagination apply-sort-4 audit-transact audit-transact-batch conn merge-query observable-query pull-many remove-nils]] [auto-ap.datomic.accounts :as d-accounts] @@ -289,7 +289,7 @@ (merge-query {:query {:find ['?sort-default '?e]}})))] (->> (observable-query query) - (apply-sort-3 (assoc query-params :default-asc? true)) + (apply-sort-4 (assoc query-params :default-asc? true)) (apply-pagination query-params)))) (def default-read diff --git a/terraform/terraform.tfstate.d/prod/terraform.tfstate b/terraform/terraform.tfstate.d/prod/terraform.tfstate index a216c291..1def819b 100644 --- a/terraform/terraform.tfstate.d/prod/terraform.tfstate +++ b/terraform/terraform.tfstate.d/prod/terraform.tfstate @@ -1,7 +1,7 @@ { "version": 4, - "terraform_version": "1.8.3", - "serial": 693, + "terraform_version": "1.9.2", + "serial": 712, "lineage": "9b630886-8cee-a57d-c7a2-4f19f13f9c51", "outputs": { "aws_access_key_id": { @@ -18,12 +18,107 @@ "type": "string", "sensitive": true }, + "ec2_public_ip": { + "value": "54.175.3.15", + "type": "string" + }, "queue_url": { "value": "https://sqs.us-east-1.amazonaws.com/679918342773/integreat-mail-prod", "type": "string" } }, "resources": [ + { + "mode": "data", + "type": "aws_ami", + "name": "amazon_linux_2023", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "architecture": "arm64", + "arn": "arn:aws:ec2:us-east-1::image/ami-0fea1219385942eb5", + "block_device_mappings": [ + { + "device_name": "/dev/xvda", + "ebs": { + "delete_on_termination": "true", + "encrypted": "false", + "iops": "3000", + "snapshot_id": "snap-0631ed3b265acda34", + "throughput": "125", + "volume_size": "30", + "volume_type": "gp3" + }, + "no_device": "", + "virtual_name": "" + } + ], + "boot_mode": "uefi", + "creation_date": "2024-09-17T21:17:56.000Z", + "deprecation_time": "2026-09-17T21:17:56.000Z", + "description": "Amazon Linux AMI 2023.0.20240917 arm64 ECS HVM EBS", + "ena_support": true, + "executable_users": null, + "filter": [ + { + "name": "architecture", + "values": [ + "arm64" + ] + }, + { + "name": "name", + "values": [ + "al2023-ami-*" + ] + }, + { + "name": "virtualization-type", + "values": [ + "hvm" + ] + } + ], + "hypervisor": "xen", + "id": "ami-0fea1219385942eb5", + "image_id": "ami-0fea1219385942eb5", + "image_location": "amazon/al2023-ami-ecs-hvm-2023.0.20240917-kernel-6.1-arm64", + "image_owner_alias": "amazon", + "image_type": "machine", + "imds_support": "v2.0", + "include_deprecated": false, + "kernel_id": "", + "most_recent": true, + "name": "al2023-ami-ecs-hvm-2023.0.20240917-kernel-6.1-arm64", + "name_regex": null, + "owner_id": "591542846629", + "owners": null, + "platform": "", + "platform_details": "Linux/UNIX", + "product_codes": [], + "public": true, + "ramdisk_id": "", + "root_device_name": "/dev/xvda", + "root_device_type": "ebs", + "root_snapshot_id": "snap-0631ed3b265acda34", + "sriov_net_support": "simple", + "state": "available", + "state_reason": { + "code": "UNSET", + "message": "UNSET" + }, + "tags": {}, + "timeouts": null, + "tpm_support": "", + "usage_operation": "RunInstances", + "virtualization_type": "hvm" + }, + "sensitive_attributes": [] + } + ] + }, { "mode": "data", "type": "aws_caller_identity", @@ -115,8 +210,8 @@ "early_renewal_duration": "", "id": "arn:aws:acm:us-east-1:679918342773:certificate/edf1d7f0-8358-4a40-a44f-3ccdb81da12f", "key_algorithm": "RSA_2048", - "not_after": "2024-07-27T23:59:59Z", - "not_before": "2023-06-29T00:00:00Z", + "not_after": "2025-06-27T23:59:59Z", + "not_before": "2024-05-29T00:00:00Z", "options": [ { "certificate_transparency_logging_preference": "ENABLED" @@ -129,7 +224,7 @@ { "renewal_status": "SUCCESS", "renewal_status_reason": "", - "updated_at": "2023-06-29T04:17:46Z" + "updated_at": "2024-05-29T05:27:07Z" } ], "status": "ISSUED", @@ -180,8 +275,8 @@ "early_renewal_duration": "", "id": "arn:aws:acm:us-east-1:679918342773:certificate/9dce79fb-fc06-438b-8188-f54313b5161a", "key_algorithm": "RSA_2048", - "not_after": "2024-09-01T23:59:59Z", - "not_before": "2023-08-04T00:00:00Z", + "not_after": "2025-08-03T23:59:59Z", + "not_before": "2024-07-04T00:00:00Z", "options": [ { "certificate_transparency_logging_preference": "ENABLED" @@ -190,7 +285,13 @@ "pending_renewal": false, "private_key": null, "renewal_eligibility": "ELIGIBLE", - "renewal_summary": [], + "renewal_summary": [ + { + "renewal_status": "SUCCESS", + "renewal_status_reason": "", + "updated_at": "2024-07-04T02:01:27Z" + } + ], "status": "ISSUED", "subject_alternative_names": [ "data.prod.app.integreatconsult.com" @@ -214,6 +315,45 @@ } ] }, + { + "mode": "managed", + "type": "aws_ebs_volume", + "name": "solr_ec2_storage", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "arn": "arn:aws:ec2:us-east-1:679918342773:volume/vol-0069283d41ff6c010", + "availability_zone": "us-east-1a", + "encrypted": false, + "final_snapshot": false, + "id": "vol-0069283d41ff6c010", + "iops": 100, + "kms_key_id": "", + "multi_attach_enabled": false, + "outpost_arn": "", + "size": 30, + "snapshot_id": "", + "tags": { + "Name": "solr_storage_prod" + }, + "tags_all": { + "Name": "solr_storage_prod" + }, + "throughput": 0, + "timeouts": null, + "type": "gp2" + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozMDAwMDAwMDAwMDAsImRlbGV0ZSI6MzAwMDAwMDAwMDAwLCJ1cGRhdGUiOjMwMDAwMDAwMDAwMH19", + "dependencies": [ + "aws_instance.solr_ec2", + "data.aws_ami.amazon_linux_2023" + ] + } + ] + }, { "mode": "managed", "type": "aws_ecs_service", @@ -295,7 +435,7 @@ ], "tags": {}, "tags_all": {}, - "task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/integreat_app_prod:789", + "task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/integreat_app_prod:834", "timeouts": { "create": null, "delete": null, @@ -385,7 +525,7 @@ ], "tags": {}, "tags_all": {}, - "task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/solr_prod:2", + "task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/solr_prod:4", "timeouts": { "create": null, "delete": null, @@ -527,9 +667,9 @@ "provisioned_throughput_in_mibps": 0, "size_in_bytes": [ { - "value": 757790720, + "value": 1429075968, "value_in_ia": 0, - "value_in_standard": 757790720 + "value_in_standard": 1429075968 } ], "tags": { @@ -569,13 +709,13 @@ [ { "type": "get_attr", - "value": "secret" + "value": "ses_smtp_password_v4" } ], [ { "type": "get_attr", - "value": "ses_smtp_password_v4" + "value": "secret" } ] ], @@ -628,6 +768,137 @@ } ] }, + { + "mode": "managed", + "type": "aws_instance", + "name": "solr_ec2", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 1, + "attributes": { + "ami": "ami-0fea1219385942eb5", + "arn": "arn:aws:ec2:us-east-1:679918342773:instance/i-0ce809d16781daada", + "associate_public_ip_address": true, + "availability_zone": "us-east-1a", + "capacity_reservation_specification": [ + { + "capacity_reservation_preference": "open", + "capacity_reservation_target": [] + } + ], + "cpu_core_count": 2, + "cpu_options": [ + { + "amd_sev_snp": "", + "core_count": 2, + "threads_per_core": 1 + } + ], + "cpu_threads_per_core": 1, + "credit_specification": [], + "disable_api_stop": false, + "disable_api_termination": false, + "ebs_block_device": [], + "ebs_optimized": false, + "enclave_options": [ + { + "enabled": false + } + ], + "ephemeral_block_device": [], + "get_password_data": false, + "hibernation": false, + "host_id": "", + "host_resource_group_arn": null, + "iam_instance_profile": "", + "id": "i-0ce809d16781daada", + "instance_initiated_shutdown_behavior": "stop", + "instance_state": "running", + "instance_type": "m7g.large", + "ipv6_address_count": 0, + "ipv6_addresses": [], + "key_name": "http-proxy", + "launch_template": [], + "maintenance_options": [ + { + "auto_recovery": "default" + } + ], + "metadata_options": [ + { + "http_endpoint": "enabled", + "http_put_response_hop_limit": 2, + "http_tokens": "required", + "instance_metadata_tags": "disabled" + } + ], + "monitoring": false, + "network_interface": [], + "outpost_arn": "", + "password_data": "", + "placement_group": "", + "placement_partition_number": 0, + "primary_network_interface_id": "eni-07dec2725fa4c70ed", + "private_dns": "ip-172-31-38-103.ec2.internal", + "private_dns_name_options": [ + { + "enable_resource_name_dns_a_record": false, + "enable_resource_name_dns_aaaa_record": false, + "hostname_type": "ip-name" + } + ], + "private_ip": "172.31.38.103", + "public_dns": "ec2-54-175-3-15.compute-1.amazonaws.com", + "public_ip": "54.175.3.15", + "root_block_device": [ + { + "delete_on_termination": true, + "device_name": "/dev/xvda", + "encrypted": false, + "iops": 3000, + "kms_key_id": "", + "tags": null, + "throughput": 125, + "volume_id": "vol-0ec6fb488e712ba93", + "volume_size": 30, + "volume_type": "gp3" + } + ], + "secondary_private_ips": [], + "security_groups": [ + "datomic-access", + "http-proxy-2", + "integreat-app" + ], + "source_dest_check": true, + "subnet_id": "subnet-89bab8d4", + "tags": { + "Name": "solr_ec2_prod" + }, + "tags_all": { + "Name": "solr_ec2_prod" + }, + "tenancy": "default", + "timeouts": null, + "user_data": null, + "user_data_base64": null, + "user_data_replace_on_change": false, + "volume_tags": null, + "vpc_security_group_ids": [ + "sg-004e5855310c453a3", + "sg-02d167406b1082698", + "sg-08cd873bd29a2b3c9" + ] + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsImRlbGV0ZSI6MTIwMDAwMDAwMDAwMCwidXBkYXRlIjo2MDAwMDAwMDAwMDB9LCJzY2hlbWFfdmVyc2lvbiI6IjEifQ==", + "dependencies": [ + "data.aws_ami.amazon_linux_2023" + ] + } + ] + }, { "mode": "managed", "type": "aws_lb", @@ -1334,6 +1605,32 @@ } ] }, + { + "mode": "managed", + "type": "aws_service_discovery_instance", + "name": "solr_instance", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "attributes": { + "AWS_INSTANCE_IPV4": "172.31.38.103" + }, + "id": "solr-ec2", + "instance_id": "solr-ec2", + "service_id": "srv-ren22oppkwwryqqr" + }, + "sensitive_attributes": [], + "private": "bnVsbA==", + "dependencies": [ + "aws_instance.solr_ec2", + "aws_service_discovery_service.solr_ec2", + "data.aws_ami.amazon_linux_2023" + ] + } + ] + }, { "mode": "managed", "type": "aws_service_discovery_service", @@ -1418,6 +1715,48 @@ } ] }, + { + "mode": "managed", + "type": "aws_service_discovery_service", + "name": "solr_ec2", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "arn": "arn:aws:servicediscovery:us-east-1:679918342773:service/srv-ren22oppkwwryqqr", + "description": "", + "dns_config": [ + { + "dns_records": [ + { + "ttl": 60, + "type": "A" + } + ], + "namespace_id": "ns-gv2z744em7myo2jp", + "routing_policy": "MULTIVALUE" + } + ], + "force_destroy": false, + "health_check_config": [], + "health_check_custom_config": [ + { + "failure_threshold": 1 + } + ], + "id": "srv-ren22oppkwwryqqr", + "name": "solr-ec2-prod", + "namespace_id": "ns-gv2z744em7myo2jp", + "tags": {}, + "tags_all": {}, + "type": "DNS_HTTP" + }, + "sensitive_attributes": [], + "private": "bnVsbA==" + } + ] + }, { "mode": "managed", "type": "aws_ses_receipt_rule", @@ -1594,6 +1933,34 @@ } ] }, + { + "mode": "managed", + "type": "aws_volume_attachment", + "name": "attach_solr_storage", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "device_name": "/dev/xvdf", + "force_detach": null, + "id": "vai-3578365595", + "instance_id": "i-0ce809d16781daada", + "skip_destroy": null, + "stop_instance_before_detaching": null, + "timeouts": null, + "volume_id": "vol-0069283d41ff6c010" + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozMDAwMDAwMDAwMDAsImRlbGV0ZSI6MzAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "aws_ebs_volume.solr_ec2_storage", + "aws_instance.solr_ec2", + "data.aws_ami.amazon_linux_2023" + ] + } + ] + }, { "module": "module.bulk_journal_import_job[0]", "mode": "managed", @@ -3404,7 +3771,7 @@ "revision": 5, "runtime_platform": [], "skip_destroy": false, - "tags": null, + "tags": {}, "tags_all": {}, "task_role_arn": "arn:aws:iam::679918342773:role/datomic-ddb", "volume": [] diff --git a/terraform/terraform.tfstate.d/prod/terraform.tfstate.backup b/terraform/terraform.tfstate.d/prod/terraform.tfstate.backup index de5789d7..938664ec 100644 --- a/terraform/terraform.tfstate.d/prod/terraform.tfstate.backup +++ b/terraform/terraform.tfstate.d/prod/terraform.tfstate.backup @@ -1,7 +1,7 @@ { "version": 4, - "terraform_version": "1.8.3", - "serial": 689, + "terraform_version": "1.9.2", + "serial": 704, "lineage": "9b630886-8cee-a57d-c7a2-4f19f13f9c51", "outputs": { "aws_access_key_id": { @@ -18,12 +18,107 @@ "type": "string", "sensitive": true }, + "ec2_public_ip": { + "value": "54.162.172.142", + "type": "string" + }, "queue_url": { "value": "https://sqs.us-east-1.amazonaws.com/679918342773/integreat-mail-prod", "type": "string" } }, "resources": [ + { + "mode": "data", + "type": "aws_ami", + "name": "amazon_linux_2", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "architecture": "arm64", + "arn": "arn:aws:ec2:us-east-1::image/ami-0c32fe44cfb616fdd", + "block_device_mappings": [ + { + "device_name": "/dev/xvda", + "ebs": { + "delete_on_termination": "true", + "encrypted": "false", + "iops": "0", + "snapshot_id": "snap-0d41f1cffffa2ecba", + "throughput": "0", + "volume_size": "8", + "volume_type": "gp2" + }, + "no_device": "", + "virtual_name": "" + } + ], + "boot_mode": "", + "creation_date": "2024-09-16T18:28:30.000Z", + "deprecation_time": "2025-07-01T00:00:00.000Z", + "description": "Amazon Linux 2 LTS Arm64 AMI 2.0.20240916.0 arm64 HVM gp2", + "ena_support": true, + "executable_users": null, + "filter": [ + { + "name": "architecture", + "values": [ + "arm64" + ] + }, + { + "name": "name", + "values": [ + "amzn2-ami-hvm-*" + ] + }, + { + "name": "virtualization-type", + "values": [ + "hvm" + ] + } + ], + "hypervisor": "xen", + "id": "ami-0c32fe44cfb616fdd", + "image_id": "ami-0c32fe44cfb616fdd", + "image_location": "amazon/amzn2-ami-hvm-2.0.20240916.0-arm64-gp2", + "image_owner_alias": "amazon", + "image_type": "machine", + "imds_support": "", + "include_deprecated": false, + "kernel_id": "", + "most_recent": true, + "name": "amzn2-ami-hvm-2.0.20240916.0-arm64-gp2", + "name_regex": null, + "owner_id": "137112412989", + "owners": null, + "platform": "", + "platform_details": "Linux/UNIX", + "product_codes": [], + "public": true, + "ramdisk_id": "", + "root_device_name": "/dev/xvda", + "root_device_type": "ebs", + "root_snapshot_id": "snap-0d41f1cffffa2ecba", + "sriov_net_support": "simple", + "state": "available", + "state_reason": { + "code": "UNSET", + "message": "UNSET" + }, + "tags": {}, + "timeouts": null, + "tpm_support": "", + "usage_operation": "RunInstances", + "virtualization_type": "hvm" + }, + "sensitive_attributes": [] + } + ] + }, { "mode": "data", "type": "aws_caller_identity", @@ -115,8 +210,8 @@ "early_renewal_duration": "", "id": "arn:aws:acm:us-east-1:679918342773:certificate/edf1d7f0-8358-4a40-a44f-3ccdb81da12f", "key_algorithm": "RSA_2048", - "not_after": "2024-07-27T23:59:59Z", - "not_before": "2023-06-29T00:00:00Z", + "not_after": "2025-06-27T23:59:59Z", + "not_before": "2024-05-29T00:00:00Z", "options": [ { "certificate_transparency_logging_preference": "ENABLED" @@ -129,7 +224,7 @@ { "renewal_status": "SUCCESS", "renewal_status_reason": "", - "updated_at": "2023-06-29T04:17:46Z" + "updated_at": "2024-05-29T05:27:07Z" } ], "status": "ISSUED", @@ -143,7 +238,14 @@ "validation_method": "DNS", "validation_option": [] }, - "sensitive_attributes": [], + "sensitive_attributes": [ + [ + { + "type": "get_attr", + "value": "private_key" + } + ] + ], "private": "bnVsbA==" } ] @@ -173,8 +275,8 @@ "early_renewal_duration": "", "id": "arn:aws:acm:us-east-1:679918342773:certificate/9dce79fb-fc06-438b-8188-f54313b5161a", "key_algorithm": "RSA_2048", - "not_after": "2024-09-01T23:59:59Z", - "not_before": "2023-08-04T00:00:00Z", + "not_after": "2025-08-03T23:59:59Z", + "not_before": "2024-07-04T00:00:00Z", "options": [ { "certificate_transparency_logging_preference": "ENABLED" @@ -183,7 +285,13 @@ "pending_renewal": false, "private_key": null, "renewal_eligibility": "ELIGIBLE", - "renewal_summary": [], + "renewal_summary": [ + { + "renewal_status": "SUCCESS", + "renewal_status_reason": "", + "updated_at": "2024-07-04T02:01:27Z" + } + ], "status": "ISSUED", "subject_alternative_names": [ "data.prod.app.integreatconsult.com" @@ -195,11 +303,57 @@ "validation_method": "DNS", "validation_option": [] }, - "sensitive_attributes": [], + "sensitive_attributes": [ + [ + { + "type": "get_attr", + "value": "private_key" + } + ] + ], "private": "bnVsbA==" } ] }, + { + "mode": "managed", + "type": "aws_ebs_volume", + "name": "solr_ec2_storage", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "arn": "arn:aws:ec2:us-east-1:679918342773:volume/vol-010fe54b640fb8a99", + "availability_zone": "us-east-1a", + "encrypted": false, + "final_snapshot": false, + "id": "vol-010fe54b640fb8a99", + "iops": 100, + "kms_key_id": "", + "multi_attach_enabled": false, + "outpost_arn": "", + "size": 30, + "snapshot_id": "", + "tags": { + "Name": "solr_storage_prod" + }, + "tags_all": { + "Name": "solr_storage_prod" + }, + "throughput": 0, + "timeouts": null, + "type": "gp2" + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozMDAwMDAwMDAwMDAsImRlbGV0ZSI6MzAwMDAwMDAwMDAwLCJ1cGRhdGUiOjMwMDAwMDAwMDAwMH19", + "dependencies": [ + "aws_instance.solr_ec2", + "data.aws_ami.amazon_linux_2" + ] + } + ] + }, { "mode": "managed", "type": "aws_ecs_service", @@ -281,7 +435,7 @@ ], "tags": {}, "tags_all": {}, - "task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/integreat_app_prod:782", + "task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/integreat_app_prod:834", "timeouts": { "create": null, "delete": null, @@ -371,7 +525,7 @@ ], "tags": {}, "tags_all": {}, - "task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/solr_prod:1", + "task_definition": "arn:aws:ecs:us-east-1:679918342773:task-definition/solr_prod:4", "timeouts": { "create": null, "delete": null, @@ -513,9 +667,9 @@ "provisioned_throughput_in_mibps": 0, "size_in_bytes": [ { - "value": 699342848, + "value": 1429075968, "value_in_ia": 0, - "value_in_standard": 699342848 + "value_in_standard": 1429075968 } ], "tags": { @@ -551,7 +705,20 @@ "status": "Active", "user": "integreat-prod" }, - "sensitive_attributes": [], + "sensitive_attributes": [ + [ + { + "type": "get_attr", + "value": "ses_smtp_password_v4" + } + ], + [ + { + "type": "get_attr", + "value": "secret" + } + ] + ], "dependencies": [ "aws_iam_user.app_user" ] @@ -601,6 +768,152 @@ } ] }, + { + "mode": "managed", + "type": "aws_instance", + "name": "solr_ec2", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 1, + "attributes": { + "ami": "ami-0c32fe44cfb616fdd", + "arn": "arn:aws:ec2:us-east-1:679918342773:instance/i-0bbdf9c800a03cba7", + "associate_public_ip_address": true, + "availability_zone": "us-east-1a", + "capacity_reservation_specification": [ + { + "capacity_reservation_preference": "open", + "capacity_reservation_target": [] + } + ], + "cpu_core_count": 2, + "cpu_options": [ + { + "amd_sev_snp": "", + "core_count": 2, + "threads_per_core": 1 + } + ], + "cpu_threads_per_core": 1, + "credit_specification": [], + "disable_api_stop": false, + "disable_api_termination": false, + "ebs_block_device": [ + { + "delete_on_termination": false, + "device_name": "/dev/xvdf", + "encrypted": false, + "iops": 100, + "kms_key_id": "", + "snapshot_id": "", + "tags": { + "Name": "solr_storage_prod" + }, + "throughput": 0, + "volume_id": "vol-010fe54b640fb8a99", + "volume_size": 30, + "volume_type": "gp2" + } + ], + "ebs_optimized": false, + "enclave_options": [ + { + "enabled": false + } + ], + "ephemeral_block_device": [], + "get_password_data": false, + "hibernation": false, + "host_id": "", + "host_resource_group_arn": null, + "iam_instance_profile": "", + "id": "i-0bbdf9c800a03cba7", + "instance_initiated_shutdown_behavior": "stop", + "instance_state": "running", + "instance_type": "m7g.large", + "ipv6_address_count": 0, + "ipv6_addresses": [], + "key_name": "http-proxy", + "launch_template": [], + "maintenance_options": [ + { + "auto_recovery": "default" + } + ], + "metadata_options": [ + { + "http_endpoint": "enabled", + "http_put_response_hop_limit": 1, + "http_tokens": "optional", + "instance_metadata_tags": "disabled" + } + ], + "monitoring": false, + "network_interface": [], + "outpost_arn": "", + "password_data": "", + "placement_group": "", + "placement_partition_number": 0, + "primary_network_interface_id": "eni-0c7562b5274a4b60d", + "private_dns": "ip-172-31-46-148.ec2.internal", + "private_dns_name_options": [ + { + "enable_resource_name_dns_a_record": false, + "enable_resource_name_dns_aaaa_record": false, + "hostname_type": "ip-name" + } + ], + "private_ip": "172.31.46.148", + "public_dns": "ec2-54-162-172-142.compute-1.amazonaws.com", + "public_ip": "54.162.172.142", + "root_block_device": [ + { + "delete_on_termination": true, + "device_name": "/dev/xvda", + "encrypted": false, + "iops": 100, + "kms_key_id": "", + "tags": {}, + "throughput": 0, + "volume_id": "vol-0fea5a3f3ca20ab76", + "volume_size": 30, + "volume_type": "gp2" + } + ], + "secondary_private_ips": [], + "security_groups": [ + "datomic-access", + "integreat-app" + ], + "source_dest_check": true, + "subnet_id": "subnet-89bab8d4", + "tags": { + "Name": "solr_ec2_prod" + }, + "tags_all": { + "Name": "solr_ec2_prod" + }, + "tenancy": "default", + "timeouts": null, + "user_data": null, + "user_data_base64": null, + "user_data_replace_on_change": false, + "volume_tags": null, + "vpc_security_group_ids": [ + "sg-004e5855310c453a3", + "sg-02d167406b1082698", + "sg-08cd873bd29a2b3c9" + ] + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsImRlbGV0ZSI6MTIwMDAwMDAwMDAwMCwidXBkYXRlIjo2MDAwMDAwMDAwMDB9LCJzY2hlbWFfdmVyc2lvbiI6IjEifQ==", + "dependencies": [ + "data.aws_ami.amazon_linux_2" + ] + } + ] + }, { "mode": "managed", "type": "aws_lb", @@ -1307,6 +1620,32 @@ } ] }, + { + "mode": "managed", + "type": "aws_service_discovery_instance", + "name": "solr_instance", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "attributes": { + "AWS_INSTANCE_IPV4": "172.31.46.148" + }, + "id": "solr-ec2", + "instance_id": "solr-ec2", + "service_id": "srv-ren22oppkwwryqqr" + }, + "sensitive_attributes": [], + "private": "bnVsbA==", + "dependencies": [ + "aws_instance.solr_ec2", + "aws_service_discovery_service.solr_ec2", + "data.aws_ami.amazon_linux_2" + ] + } + ] + }, { "mode": "managed", "type": "aws_service_discovery_service", @@ -1391,6 +1730,48 @@ } ] }, + { + "mode": "managed", + "type": "aws_service_discovery_service", + "name": "solr_ec2", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "arn": "arn:aws:servicediscovery:us-east-1:679918342773:service/srv-ren22oppkwwryqqr", + "description": "", + "dns_config": [ + { + "dns_records": [ + { + "ttl": 60, + "type": "A" + } + ], + "namespace_id": "ns-gv2z744em7myo2jp", + "routing_policy": "MULTIVALUE" + } + ], + "force_destroy": false, + "health_check_config": [], + "health_check_custom_config": [ + { + "failure_threshold": 1 + } + ], + "id": "srv-ren22oppkwwryqqr", + "name": "solr-ec2-prod", + "namespace_id": "ns-gv2z744em7myo2jp", + "tags": {}, + "tags_all": {}, + "type": "DNS_HTTP" + }, + "sensitive_attributes": [], + "private": "bnVsbA==" + } + ] + }, { "mode": "managed", "type": "aws_ses_receipt_rule", @@ -1567,6 +1948,34 @@ } ] }, + { + "mode": "managed", + "type": "aws_volume_attachment", + "name": "attach_solr_storage", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "device_name": "/dev/xvdf", + "force_detach": null, + "id": "vai-172440334", + "instance_id": "i-0bbdf9c800a03cba7", + "skip_destroy": null, + "stop_instance_before_detaching": null, + "timeouts": null, + "volume_id": "vol-010fe54b640fb8a99" + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozMDAwMDAwMDAwMDAsImRlbGV0ZSI6MzAwMDAwMDAwMDAwfX0=", + "dependencies": [ + "aws_ebs_volume.solr_ec2_storage", + "aws_instance.solr_ec2", + "data.aws_ami.amazon_linux_2" + ] + } + ] + }, { "module": "module.bulk_journal_import_job[0]", "mode": "managed", @@ -1629,7 +2038,7 @@ "name_prefix": "", "role_arn": "", "schedule_expression": "rate(1 hour)", - "tags": null, + "tags": {}, "tags_all": {} }, "sensitive_attributes": [], @@ -1676,7 +2085,7 @@ "placement_constraint": [], "platform_version": "", "propagate_tags": "TASK_DEFINITION", - "tags": null, + "tags": {}, "task_count": 1, "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/close_auto_invoices_prod:3" } @@ -1767,7 +2176,7 @@ "name_prefix": "", "role_arn": "", "schedule_expression": "rate(60 minutes)", - "tags": null, + "tags": {}, "tags_all": {} }, "sensitive_attributes": [], @@ -1814,7 +2223,7 @@ "placement_constraint": [], "platform_version": "", "propagate_tags": "TASK_DEFINITION", - "tags": null, + "tags": {}, "task_count": 1, "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/current_balance_cache_prod:3" } @@ -1905,7 +2314,7 @@ "name_prefix": "", "role_arn": "", "schedule_expression": "rate(1 hour)", - "tags": null, + "tags": {}, "tags_all": {} }, "sensitive_attributes": [], @@ -1952,7 +2361,7 @@ "placement_constraint": [], "platform_version": "", "propagate_tags": "TASK_DEFINITION", - "tags": null, + "tags": {}, "task_count": 1, "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/import_uploaded_invoices_prod:3" } @@ -2043,7 +2452,7 @@ "name_prefix": "", "role_arn": "", "schedule_expression": "rate(6 hours)", - "tags": null, + "tags": {}, "tags_all": {} }, "sensitive_attributes": [], @@ -2090,7 +2499,7 @@ "placement_constraint": [], "platform_version": "", "propagate_tags": "TASK_DEFINITION", - "tags": null, + "tags": {}, "task_count": 1, "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/insight_outcome_recommendation_prod:2" } @@ -2181,7 +2590,7 @@ "name_prefix": "", "role_arn": "", "schedule_expression": "rate(6 hours)", - "tags": null, + "tags": {}, "tags_all": {} }, "sensitive_attributes": [], @@ -2228,7 +2637,7 @@ "placement_constraint": [], "platform_version": "", "propagate_tags": "TASK_DEFINITION", - "tags": null, + "tags": {}, "task_count": 1, "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/intuit_prod:4" } @@ -2498,7 +2907,7 @@ "name_prefix": "", "role_arn": "", "schedule_expression": "rate(6 hours)", - "tags": null, + "tags": {}, "tags_all": {} }, "sensitive_attributes": [], @@ -2545,7 +2954,7 @@ "placement_constraint": [], "platform_version": "", "propagate_tags": "TASK_DEFINITION", - "tags": null, + "tags": {}, "task_count": 1, "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/plaid_prod:4" } @@ -2636,7 +3045,7 @@ "name_prefix": "", "role_arn": "", "schedule_expression": "rate(1 hour)", - "tags": null, + "tags": {}, "tags_all": {} }, "sensitive_attributes": [], @@ -2683,7 +3092,7 @@ "placement_constraint": [], "platform_version": "", "propagate_tags": "TASK_DEFINITION", - "tags": null, + "tags": {}, "task_count": 1, "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/reconcile_ledger_prod:3" } @@ -2815,7 +3224,7 @@ "name_prefix": "", "role_arn": "", "schedule_expression": "rate(4 hours)", - "tags": null, + "tags": {}, "tags_all": {} }, "sensitive_attributes": [], @@ -2862,7 +3271,7 @@ "placement_constraint": [], "platform_version": "", "propagate_tags": "TASK_DEFINITION", - "tags": null, + "tags": {}, "task_count": 1, "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/square_import_job_prod:6" } @@ -2953,7 +3362,7 @@ "name_prefix": "", "role_arn": "", "schedule_expression": "rate(3 hours)", - "tags": null, + "tags": {}, "tags_all": {} }, "sensitive_attributes": [], @@ -3000,7 +3409,7 @@ "placement_constraint": [], "platform_version": "", "propagate_tags": "TASK_DEFINITION", - "tags": null, + "tags": {}, "task_count": 1, "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/sysco_prod:3" } @@ -3091,7 +3500,7 @@ "name_prefix": "", "role_arn": "", "schedule_expression": "rate(4 hours)", - "tags": null, + "tags": {}, "tags_all": {} }, "sensitive_attributes": [], @@ -3138,7 +3547,7 @@ "placement_constraint": [], "platform_version": "", "propagate_tags": "TASK_DEFINITION", - "tags": null, + "tags": {}, "task_count": 1, "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/vendor_usages_prod:3" } @@ -3270,7 +3679,7 @@ "name_prefix": "", "role_arn": "", "schedule_expression": "rate(6 hours)", - "tags": null, + "tags": {}, "tags_all": {} }, "sensitive_attributes": [], @@ -3317,9 +3726,9 @@ "placement_constraint": [], "platform_version": "", "propagate_tags": "TASK_DEFINITION", - "tags": null, + "tags": {}, "task_count": 1, - "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/yodlee2_prod:4" + "task_definition_arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/yodlee2_prod:5" } ], "event_bus_name": "default", @@ -3356,17 +3765,17 @@ { "schema_version": 1, "attributes": { - "arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/yodlee2_prod:4", + "arn": "arn:aws:ecs:us-east-1:679918342773:task-definition/yodlee2_prod:5", "arn_without_revision": "arn:aws:ecs:us-east-1:679918342773:task-definition/yodlee2_prod", "container_definitions": "[{\"cpu\":0,\"dockerLabels\":{\"com.datadoghq.tags.env\":\"prod\",\"com.datadoghq.tags.service\":\"yodlee2\"},\"environment\":[{\"name\":\"DD_CONTAINER_ENV_AS_TAGS\",\"value\":\"{\\\"INTEGREAT_JOB\\\":\\\"background_job\\\"}\"},{\"name\":\"DD_ENV\",\"value\":\"prod\"},{\"name\":\"DD_SERVICE\",\"value\":\"yodlee2\"},{\"name\":\"INTEGREAT_JOB\",\"value\":\"yodlee2\"},{\"name\":\"config\",\"value\":\"/usr/local/config/prod-background-worker.edn\"}],\"essential\":true,\"image\":\"679918342773.dkr.ecr.us-east-1.amazonaws.com/integreat-cloud:prod\",\"logConfiguration\":{\"logDriver\":\"awslogs\",\"options\":{\"awslogs-group\":\"/ecs/integreat-app-prod\",\"awslogs-region\":\"us-east-1\",\"awslogs-stream-prefix\":\"ecs\"}},\"mountPoints\":[],\"name\":\"integreat-app\",\"portMappings\":[{\"containerPort\":9000,\"hostPort\":9000,\"protocol\":\"tcp\"},{\"containerPort\":9090,\"hostPort\":9090,\"protocol\":\"tcp\"}],\"systemControls\":[],\"volumesFrom\":[]},{\"cpu\":0,\"environment\":[{\"name\":\"DD_API_KEY\",\"value\":\"ce10d932c47b358e81081ae67bd8c112\"},{\"name\":\"ECS_FARGATE\",\"value\":\"true\"}],\"essential\":true,\"image\":\"public.ecr.aws/datadog/agent:latest\",\"mountPoints\":[],\"name\":\"datadog-agent\",\"portMappings\":[],\"systemControls\":[],\"volumesFrom\":[]}]", - "cpu": "1024", + "cpu": "2048", "ephemeral_storage": [], "execution_role_arn": "arn:aws:iam::679918342773:role/ecsTaskExecutionRole", "family": "yodlee2_prod", "id": "yodlee2_prod", "inference_accelerator": [], "ipc_mode": "", - "memory": "2048", + "memory": "4096", "network_mode": "awsvpc", "pid_mode": "", "placement_constraints": [], @@ -3374,7 +3783,7 @@ "requires_compatibilities": [ "FARGATE" ], - "revision": 4, + "revision": 5, "runtime_platform": [], "skip_destroy": false, "tags": {},