SAM テンプレートに既存リソースをインポートする手順 - CloudWatch Logs 編 -


手順

CloudFormation のテンプレート取得

既にデプロイ済みの SAM プロジェクトは CloudFormation に Stack が作成されています。
その Template タグで template の内容をローカル環境で template.yml で保存しましょう。
保存先はどこでも良いです。

template.yml にインポートしたいリソースを追記

1
2
3
4
5
6
7
8
9
10
11
12
13
...
Resources:
...

# インポートしたいリソースを追記
# API Gateway の アクセスログ管理用ロググループ
ApiGatewayAccessLogGroup:
Type: AWS::Logs::LogGroup
# NOTE: リソースを作成せず、Stack にインポートする為の設定
# see: https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html
DeletionPolicy: Retain
Properties:
LogGroupName: /aws/apigateway/xxx-Bot-Stack

今回は API Gateway のアクセスログ管理用ロググループをインポートします。
DeletionPolicy: Retain としているのは、リソースを作成せず、Stack にインポートする為です。

import.json にインポートしたいリソースを記載

1
2
3
4
5
6
7
8
9
[
{
"ResourceType": "AWS::Logs::LogGroup",
"LogicalResourceId": "ApiGatewayAccessLogGroup",
"ResourceIdentifier": {
"LogGroupName":"/aws/apigateway/xxx-Bot-Stack"
}
}
]

import.json にインポート対象のリソースを追加し
先程の template.yml と同じディレクトリに保存します。

Change sets を作成する

1
2
3
4
5
6
7
$ aws cloudformation create-change-set \
--stack-name xxx-Bot-Stack \
--change-set-name import-apigateway-accesslog-loggroup \
--resources-to-import file://import.json \
--change-set-type IMPORT \
--template-body file://template.yml \
--capabilities CAPABILITY_IAM

※ このコマンド実行した時点ではインポートは実行されません。

コマンド実行後、以下のように Change sets にセットが追加されていれば OK です。

Change sets の Name がリンクになっているのでクリックします。

change set を実行 (インポート実行)

右上の Execute change set ボタンをクリックし Stack へのインポート処理を実行します。

ステータス= IMPORT_COMPLETE でインポート完了となります。

インポートしたリソースにタグが追加される

Stack にインポートしたリソースに Stack で管理されている旨のタグが追加されていることが確認できます。

SAM プロジェクト template.yml 更新

インポート用に用意した template.yml とは異なるデプロイ時に参照する yml ファイルにインポートしたリソースを定義します。
ここでは DeletionPolicy: Retain は不要です。

1
2
3
4
5
6
7
8
Resources:
...
# 追記
ApiGatewayAccessLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: /aws/apigateway/xxx-Bot-Stack
RetentionInDays: 14

SAM プロジェクトで管理するテンプレートファイルで DeletionPolicy: Retain の差分がある為、変更の差分が出ます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$ sam deploy -t ${TEMPLATE_FILE} \
--stack-name xxx-Bot-Stack \
--s3-prefix xxx-Bot-Stack \
--s3-bucket yyy \
--capabilities CAPABILITY_IAM \
--region ap-northeast-1 \
--no-fail-on-empty-changeset \
--no-progressbar

Initiating deployment
=====================

File with same data already exists at xxx-Bot-Stack/nnn.template, skipping upload


Waiting for changeset to be created..

CloudFormation stack changeset
---------------------------------------------------------------------------------------------------------------------------------
Operation LogicalResourceId ResourceType Replacement
---------------------------------------------------------------------------------------------------------------------------------
* Modify ApiGatewayAccessLogGroup AWS::Logs::LogGroup False
---------------------------------------------------------------------------------------------------------------------------------


Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/samcli-deploy123/zzz


2023-06-07 12:22:16 - Waiting for stack create/update to complete

CloudFormation events from stack operations (refresh every 5.0 seconds)
---------------------------------------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason
---------------------------------------------------------------------------------------------------------------------------------
UPDATE_COMPLETE AWS::Logs::LogGroup ApiGatewayAccessLogGroup -
UPDATE_COMPLETE_CLEANUP_IN_PRO AWS::CloudFormation::Stack xxx-Bot-Stack -
GRESS
UPDATE_COMPLETE AWS::CloudFormation::Stack xxx-Bot-Stack -
---------------------------------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
------------------------------------------------------------------------------------------------------------------------------------
Outputs
------------------------------------------------------------------------------------------------------------------------------------
Key SlackMessageApi
Description -
Value https://yyy.execute-api.ap-northeast-1.amazonaws.com/Prod/message/
------------------------------------------------------------------------------------------------------------------------------------


Successfully created/updated stack - xxx-Bot-Stack in ap-northeast-1

デプロイ後、再度デプロイしようとすると差分がなくなることを確認できました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sam deploy -t ${TEMPLATE_FILE} \
--stack-name xxx-Bot-Stack \
--s3-prefix xxx-Bot-Stack \
--s3-bucket yyy \
--capabilities CAPABILITY_IAM \
--region ap-northeast-1 \
--no-fail-on-empty-changeset \
--no-progressbar

File with same data already exists at xxx-Bot-Stack/7d47ca74f4c587c742cd0df1f7252ecd.template, skipping upload


Waiting for changeset to be created..

No changes to deploy. Stack xxx-Bot-Stack is up to date

これにてインポートが問題なくできたことを確認できました。

おまけ: SAM リソースを管理除外する (import の逆)

Stack > Template を template.yml で保存し、対象リソースを削除し以下コマンドを実行します。

インポートしたロググループを除外する Change set を作成します。

1
2
3
4
5
6
aws cloudformation create-change-set \
--stack-name xxx-Bot-Stack \
--change-set-name remove-apigateway-loggroup \
--change-set-type UPDATE \
--template-body file://template.yml \
--capabilities CAPABILITY_IAM

コンソール上で Execute change set を実行し削除できます。

以上
参考になれば幸いです。

SAM テンプレートに既存リソースをインポートする手順 - CloudWatch Logs 編 -

https://kenzo0107.github.io/2023/06/06/2023-06-07-aws-sam-import-resource/

Author

Kenzo Tanaka

Posted on

2023-06-07

Licensed under

コメント