Mwen te kòmanse travay avèk yo fòmasyon nwaj 4 ane de sa. Depi lè sa a mwen kraze anpil enfrastrikti, menm sa ki te deja nan pwodiksyon. Men, chak fwa mwen dezòd yon bagay, mwen aprann yon bagay nouvo. Atravè eksperyans sa a, mwen pral pataje kèk nan leson ki pi enpòtan mwen te aprann yo.
Leson 1: Teste chanjman anvan deplwaye yo
Mwen te aprann leson sa a touswit apre mwen te kòmanse travay avèk yo fòmasyon nwaj. Mwen pa sonje ki sa egzakteman mwen te kraze lè sa a, men mwen definitivman sonje ke mwen te itilize kòmandman an aws cloudformation aktyalizasyon. Kòmandman sa a tou senpleman woule modèl la san okenn validation nan chanjman yo pral deplwaye. Mwen pa panse okenn eksplikasyon ki nesesè pou poukisa ou ta dwe teste tout chanjman anvan deplwaye yo.
Apre echèk sa a, mwen imedyatman chanje deplwaman tiyo, ranplase lòd aktyalizasyon a ak kòmandman an kreye-chanjman-ansanm
# OPERATION is either "UPDATE" or "CREATE"
changeset_id=$(aws cloudformation create-change-set
--change-set-name "$CHANGE_SET_NAME"
--stack-name "$STACK_NAME"
--template-body "$TPL_PATH"
--change-set-type "$OPERATION"
--parameters "$PARAMETERS"
--output text
--query Id)
aws cloudformation wait
change-set-create-complete --change-set-name "$changeset_id"
Yon fwa yo kreye yon chanjman, li pa gen okenn efè sou pil ki deja egziste a. Kontrèman ak lòd aktyalizasyon an, apwòch chanjman an pa deklanche deplwaman aktyèl la. Olye de sa, li kreye yon lis chanjman ke ou ka revize anvan deplwaman. Ou ka wè chanjman ki fèt nan koòdone konsole aws la. Men, si ou prefere otomatize tout sa ou kapab, Lè sa a, tcheke yo nan CLI a:
# this command is presented only for demonstrational purposes.
# the real command should take pagination into account
aws cloudformation describe-change-set
--change-set-name "$changeset_id"
--query 'Changes[*].ResourceChange.{Action:Action,Resource:ResourceType,ResourceId:LogicalResourceId,ReplacementNeeded:Replacement}'
--output table
Kòmand sa a ta dwe pwodwi pwodiksyon ki sanble ak sa ki annapre yo:
--------------------------------------------------------------------
| DescribeChangeSet |
+---------+--------------------+----------------------+------------+
| Action | ReplacementNeeded | Resource | ResourceId |
+---------+--------------------+----------------------+------------+
| Modify | True | AWS::ECS::Cluster | MyCluster |
| Replace| True | AWS::RDS::DBInstance| MyDB |
| Add | None | AWS::SNS::Topic | MyTopic |
+---------+--------------------+----------------------+------------+
Peye atansyon espesyal sou chanjman kote Aksyon ye Ranplase, Efase oswa ki kote Ranplasman Nesesite - Vre. Sa yo se chanjman ki pi danjere e anjeneral mennen nan pèt enfòmasyon.
Yon fwa yo te revize chanjman yo, yo ka deplwaye
aws cloudformation execute-change-set --change-set-name "$changeset_id"
operation_lowercase=$(echo "$OPERATION" | tr '[:upper:]' '[:lower:]')
aws cloudformation wait "stack-${operation_lowercase}-complete"
--stack-name "$STACK_NAME"
Leson 2: Sèvi ak règleman pile pou anpeche resous eta yo ranplase oswa retire
Pafwa tou senpleman gade chanjman yo pa ase. Nou tout se moun e nou tout fè erè. Yon ti tan apre nou te kòmanse itilize chanjman, koekipye mwen an te fè yon deplwaman san yo pa konnen, ki te lakòz yon aktyalizasyon baz done a. Pa gen anyen mal ki te pase paske se te yon anviwònman tès.
Menmsi scripts nou yo te montre yon lis chanjman epi yo te mande konfimasyon, yo te sote chanjman an Ranplase paske lis chanjman yo te tèlman gwo ke li pa t 'anfòm sou ekran an. Epi kòm sa a te yon aktyalizasyon nòmal nan yon anviwònman tès, yo pa t peye anpil atansyon sou chanjman yo.
Gen resous ou pa janm vle ranplase oswa retire. Sa yo se sèvis eta, tankou yon egzanp baz done RDS oswa yon gwoup elasticsearch, elatriye. Li ta bon si aws ta otomatikman refize deplwaman si operasyon an ke yo te fè ta mande pou efase yon resous sa yo. Erezman, cloudformation gen yon fason entegre pou fè sa. Yo rele sa politik pile, epi ou ka li plis sou li nan
STACK_NAME=$1
RESOURCE_ID=$2
POLICY_JSON=$(cat <<EOF
{
"Statement" : [{
"Effect" : "Deny",
"Action" : [
"Update:Replace",
"Update:Delete"
],
"Principal": "*",
"Resource" : "LogicalResourceId/$RESOURCE_ID"
}]
}
EOF
)
aws cloudformation set-stack-policy --stack-name "$STACK_NAME"
--stack-policy-body "$POLICY_JSON"
Leson 3: Sèvi ak UsePreviousValue lè w mete ajou yon pil ak paramèt sekrè
Lè ou kreye yon antite RDS mysql, AWS mande pou ou bay yon MasterUsername ak MasterUserPassword. Depi li pi bon pou pa kenbe sekrè nan kòd sous la epi mwen te vle otomatize absoliman tout bagay, mwen te aplike yon "mekanis entelijan" kote anvan deplwaman yo pral jwenn kalifikasyon yo nan s3, epi si kalifikasyon yo pa jwenn, nouvo kalifikasyon yo pwodwi ak ki estoke nan s3.
Lè sa a, kalifikasyon sa yo pral pase kòm paramèt nan lòd la cloudformation create-change-set. Pandan y ap fè eksperyans ak script la, li te rive ke koneksyon an nan s3 te pèdi, ak "mekanis entelijan" mwen an trete li kòm yon siyal jenere nouvo kalifikasyon.
Si mwen te kòmanse itilize script sa a nan pwodiksyon ak pwoblèm koneksyon an te rive ankò, li ta mete ajou pil la ak nouvo kalifikasyon. Nan ka sa a an patikilye, pa gen anyen move ki pral rive. Sepandan, mwen te abandone apwòch sa a epi mwen te kòmanse itilize yon lòt, bay kalifikasyon yon sèl fwa - lè m ap kreye pile a. Epi pita, lè chemine a bezwen mete ajou, olye pou yo espesifye valè sekrè paramèt la, mwen ta tou senpleman itilize UsePreviousValue=vre:
aws cloudformation create-change-set
--change-set-name "$CHANGE_SET_NAME"
--stack-name "$STACK_NAME"
--template-body "$TPL_PATH"
--change-set-type "UPDATE"
--parameters "ParameterKey=MasterUserPassword,UsePreviousValue=true"
Leson 4: Sèvi ak konfigirasyon rollback
Yon lòt ekip mwen te travay ak itilize fonksyon an fòmasyon nwaj, rele konfigirasyon rollback. Mwen pa t 'vin jwenn li anvan epi byen vit reyalize ke li ta fè deplwaye pil mwen yo menm pi fre. Koulye a, mwen sèvi ak li chak fwa mwen deplwaye kòd mwen an lambda oswa ECS lè l sèvi avèk cloudformation.
Ki jan li fonksyone: ou presize CloudWatch alam arn v paramèt --rollback-konfigirasyonlè ou kreye yon chanjman. Apre sa, lè ou egzekite yon seri chanjman, aws kontwole alam la pou omwen yon minit. Li woule deplwaman an si alam chanje eta a nan ALAM pandan tan sa a.
Anba a se yon egzanp yon ekstrè modèl fòmasyon nwajnan ki mwen kreye alam cloudwatch, ki swiv yon metrik itilizatè nwaj kòm kantite erè nan mòso nwaj yo (mèt la se pwodwi atravè MetricFilter):
Resources:
# this metric tracks number of errors in the cloudwatch logs. In this
# particular case it's assumed logs are in json format and the error logs are
# identified by level "error". See FilterPattern
ErrorMetricFilter:
Type: AWS::Logs::MetricFilter
Properties:
LogGroupName: !Ref LogGroup
FilterPattern: !Sub '{$.level = "error"}'
MetricTransformations:
- MetricNamespace: !Sub "${AWS::StackName}-log-errors"
MetricName: Errors
MetricValue: 1
DefaultValue: 0
ErrorAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub "${AWS::StackName}-errors"
Namespace: !Sub "${AWS::StackName}-log-errors"
MetricName: Errors
Statistic: Maximum
ComparisonOperator: GreaterThanThreshold
Period: 1 # 1 minute
EvaluationPeriods: 1
Threshold: 0
TreatMissingData: notBreaching
ActionsEnabled: yes
Koulye a, alam ka itilize kòm Rollback deklanche lè w ap egzekite bwat zouti:
ALARM_ARN=$1
ROLLBACK_TRIGGER=$(cat <<EOF
{
"RollbackTriggers": [
{
"Arn": "$ALARM_ARN",
"Type": "AWS::CloudWatch::Alarm"
}
],
"MonitoringTimeInMinutes": 1
}
EOF
)
aws cloudformation create-change-set
--change-set-name "$CHANGE_SET_NAME"
--stack-name "$STACK_NAME"
--template-body "$TPL_PATH"
--change-set-type "UPDATE"
--rollback-configuration "$ROLLBACK_TRIGGER"
Leson 5: Asire w ou deplwaye dènye vèsyon modèl la
Li fasil pou deplwaye yon vèsyon mwens pase dènye modèl cloudformation la, men si w fè sa, sa pral lakòz anpil domaj. Sa te rive nou yon fwa: yon pwomotè pa t 'pouse dènye chanjman yo soti nan Git ak enkonsyaman deplwaye yon vèsyon anvan chemine a. Sa a te lakòz D 'pou aplikasyon an ki te itilize chemine sa a.
Yon bagay ki senp tankou ajoute yon chèk pou wè si branch lan ajou anvan ou komèt li ta bon (si git se zouti kontwòl vèsyon ou):
git fetch
HEADHASH=$(git rev-parse HEAD)
UPSTREAMHASH=$(git rev-parse master@{upstream})
if [[ "$HEADHASH" != "$UPSTREAMHASH" ]] ; then
echo "Branch is not up to date with origin. Aborting"
exit 1
fi
Leson 6: Pa re-envante wou a
Li ka sanble tankou deplwaye ak fòmasyon nwaj - li fasil. Ou jis bezwen yon pakèt scripts bash egzekite kòmandman aws cli.
4 ane de sa mwen te kòmanse ak scripts senp yo rele kòmandman aws cloudformation create-stack. Byento script la pa t senp ankò. Chak leson te aprann fè script la pi plis ak plis konplèks. Li pa te sèlman difisil, men tou, li te plen ak pinèz.
Kounye a mwen travay nan yon ti depatman IT. Eksperyans yo montre ke chak ekip gen pwòp fason pa yo deplwaye pil nwaj yo. E sa pa bon. Li ta pi bon si tout moun te pran menm apwòch la. Erezman, gen anpil zouti ki disponib pou ede w deplwaye ak konfigirasyon pil nwaj yo.
Leson sa yo ap ede ou evite erè.
Sous: www.habr.com