CloudFormation で AWS። StepFunctions። アクティビティリソースの単一スタック所有権を設定するにはどうすればよいですか?

最終更新日: 2021 年 9 月 15 日

自分の 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 をまだ使用していることを確認します。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?