自分の AWS። StepFunctions። アクティビティリソースは AWS CloudFormation 内の単一のスタックによってのみ維持されるようにしたい。
簡単な説明
AWS። StepFunctions። アクティビティリソースの所有権は、複数のスタックから維持できます。たとえば、最初の CloudFormation テンプレートを使用して StackA を作成し、2 番目のテンプレートを使用して StackB を作成できます。
StackA のテンプレート:
AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackA
Resources:
MyActivity:
Type: AWS::StepFunctions::Activity
Properties:
Name: myActivity
StackB のテンプレート:
AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackB
Resources:
MyActivityDuplicate:
Type: AWS::StepFunctions::Activity
Properties:
Name: myActivity
Tags:
- Key: Key1
Value: Val1
....
StackA と stackB は両方ともリソースを CREATE_COMPLETE として表示します。ただし、StackA および StackB で参照されるアクティビティリソースには、StackA のテンプレートで定義されているプロパティがあります。操作は成功したように見えますが、リソースのプロパティが StackA で使用されているテンプレートと一致しません。スタックのいずれかが削除されると、アクティビティも削除されます。他のスタックには、そのリソースが存在しなくなったという兆候はありません。
これは、CloudFormation を使用して、共有リソースの設定が単一の CloudFormation スタックに維持されるようにする場合のベストプラクティスです。そうすることで、リソースの設定に関する信頼できる単一のソースが提供されます。共有リソースを維持する CloudFormation スタックは、リソースの Amazon リソースネーム (ARN) をスタック出力として提供できます。その後、共有リソースに依存する他のスタックは、Step Functions アクティビティなどの共有リソースを参照できます。クロススタック参照の詳細については、「チュートリアル:別の AWS CloudFormation スタックのリソース出力を参照する」を参照してください。
解決方法
この問題を解決するには、複数のスタックで維持されている各 AWS። StepFunctions። アクティビティリソースについて、以下の手順を実行します:
1. AWS። StepFunctions። アクティビティリソースを維持している CloudFormation スタックの AWS Personal Health Dashboardで共有される ARN を特定します。
2. スタックの 1 つを単一のスタックとして指定して、今後のアクティビティを維持します。
識別されたスタック内で以下のステップを完了します:
1. CloudFormation テンプレートに Outputs セクションがない場合は、テンプレートに Outputs セクションを追加します。
2. Outputs セクションに新しい出力を追加します。新しい出力には、次のものを含める必要があります:
-
出力の一意の論理 ID。例:myActivityArn。一意の論理 ID は、テンプレートの Outputs セクション内の出力のキーとして使用します。
-
スタック出力内の Value プロパティ。Value プロパティは、アクティビティの論理 ID を引数として指定した Ref を使用して、アクティビティの ARN を取得します。
-
スタック出力への Export プロパティ。その値は、単一の Name プロパティを持つオブジェクトとして格納されます。Name プロパティの値は、他の CloudFormation スタックからこのアクティビティの ARN を参照するために使用される文字列です。以下はその例です:
AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackA
Resources:
MyActivity:
Type: AWS::StepFunctions::Activity
Properties:
Name: myActivity
Outputs:
MyActivityArn:
Value:
Ref: MyActivity
Export:
Name: MyActivityArn
3. 先行する変更でスタックを更新します。
4. アクティビティを参照しているリソースが正しい ARN をまだ使用していることを確認します。
アクティビティリソースを参照するスタックごとに、以下のステップを実行します:
1. CloudFormation コンソールで、スタックの [リソース] タブでアクティビティリソースの論理 ID を特定します。
2. アクティビティのリソース宣言に DeletionPolicy プロパティを追加します(プロパティがまだ存在しない場合)。値を Retain に設定します。以下はその例です:
AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackB
Resources:
MyActivityDuplicate:
Type: AWS::StepFunctions::Activity
DeletionPolicy: Retain
Properties:
Name: myActivity
Tags:
- Key: Key1
Value: Val1
...
3. 先行する変更でスタックを更新します。
4. このアクティビティの ARN を参照しているテンプレート内の他のリソースを特定します。
5. ステップ 4 で特定したリソースごとに、アクティビティの ARN への参照を Fn። importValue 組み込み関数に置き換えます。前に新しい出力を作成したときに指定したエクスポート名を組み込み関数の引数として渡します。以下はその例です:
AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackB
Resources:
# MyActivityDuplicate:
# DeletionPolicy: Retain
# Type: AWS::StepFunctions::Activity
# Properties:
# Name: myActivity
# Tags:
# - Key: Key1
# Value: Val1
MyStateMachine:
Type: AWS::StepFunctions::StateMachine
Properties:
StateMachineName: MyStateMachine
RoleArn: arn:aws:iam::111122223333:role/service-role/StatesExecutionRole-us-east-1
DefinitionString:
Fn::Sub:
- |
{
"Comment": "An example using a Task state.",
"StartAt": "getGreeting",
"Version": "1.0",
"TimeoutSeconds": 300,
"States":
{
"getGreeting": {
"Type": "Task",
"Resource": "${ActivityArn}",
"End": true
}
}
}
- ActivityArn:
Fn::ImportValue: MyActivityArn
6. [Resources] セクションでアクティビティのエントリを削除します。
7. 先行する変更でスタックを更新します。
8. アクティビティを参照しているリソースが正しい ARN をまだ使用していることを確認します。