連載 [第8回] :
今日からはじめる Pulumiでカンタン インフラ運用・管理既に存在するリソースをPulumiで管理してみよう
2023年10月19日(木)

第8回となる今回は、既にクラウド環境にデプロイされているリソースをPulumiで管理(import)する方法について、ハンズオンで実践していきます。
Programにimport option(リソースID)を
付与した場合のPulumi up
次に、import option(リソースID)を付与した場合のPulumi upの挙動を確認していきます。
- APIリファレンスによると、S3 Bucketの場合「bucket-name」がリソースIDとなるため、以下のように「s3.Bucket functionの引数」に「opts=ResourceOptions(import_='my-bucket-pulumi')」を追記します。「import_」に続く値がS3 BucketのリソースID(bucket-name)になります。既存リソースのimportに利用するpythonモジュール「ResourceOptions」のimportも忘れずに記載します。
【Pulumi Program (__main__.py)】
1
import pulumi
2
from pulumi_aws import s3
3
from pulumi import ResourceOptions
4
5
bucket = s3.Bucket('my-bucket-pulumi',
6
opts=ResourceOptions(import_='my-bucket-pulumi'))
7
8
pulumi.export('bucket_name', bucket.id)
- この状態で一度pulumi upを実行すると、先ほどのケースとは異なりbucketのplan内容が「create」ではなく「import」になっていることが分かります。これはS3 Bucketについて実際にリソースを作成(create)せずに、指定したIDのリソース情報をstateに追加するplan内容となります。
01
$ pulumi up
02
Previewing update (***/dev)
03
04
View in Browser (Ctrl+O): https://app.pulumi.com/***/pulumi-import/dev/previews/***
05
06
Type Name Plan
07
+ pulumi:pulumi:Stack pulumi-import-dev create
08
= └─ aws:s3:Bucket my-bucket-pulumi import
09
10
11
Outputs:
12
bucket_name: "my-bucket-pulumi"
13
14
Resources:
15
+ 1 to create
16
= 1 to import
17
2 changes
18
19
Do you want to perform this update? yes
20
Updating (***/dev)
21
22
View in Browser (Ctrl+O): https://app.pulumi.com/***/pulumi-import/dev/updates/4
23
24
Type Name Status
25
+ pulumi:pulumi:Stack pulumi-import-dev created (2s)
26
= └─ aws:s3:Bucket my-bucket-pulumi imported (0.72s)
27
28
29
Outputs:
30
bucket_name: "my-bucket-pulumi"
31
32
Resources:
33
+ 1 created
34
= 1 imported
35
2 changes
36
37
Duration: 6s
- importが無事完了すると、AWSマネジメントコンソールでは、先ほどの「リソースIDを付与しない場合のPulumi up」のケースのように新たにリソースが作成されず、かつ以下のようにstateにリソースの情報が追加されていることが確認できます。
001
$ pulumi stack export
002
003
{
004
"version": 3,
005
"deployment": {
006
"manifest": {
007
"time": "2023-09-28T17:14:41.428624+09:00",
008
"magic": "1fce246d436c6e46d168db13ed1014131c96be0ccf8401639052718fba57ac37",
009
"version": "v3.72.2"
010
},
011
"secrets_providers": {
012
"type": "service",
013
"state": {
014
"url": "https://api.pulumi.com",
015
"owner": "***",
016
"project": "pulumi-import",
017
"stack": "dev"
018
}
019
},
020
"resources": [
021
{
022
"urn": "urn:pulumi:dev::pulumi-import::pulumi:pulumi:Stack::pulumi-import-dev",
023
"custom": false,
024
"type": "pulumi:pulumi:Stack",
025
"outputs": {
026
"bucket_name": "my-bucket-pulumi"
027
},
028
"created": "2023-09-28T08:14:39.351901Z",
029
"modified": "2023-09-28T08:14:39.351901Z"
030
},
031
{
032
"urn": "urn:pulumi:dev::pulumi-import::pulumi:providers:aws::default_6_2_1",
033
"custom": true,
034
"id": "b4c8a4e5-e5ce-4b35-88ae-fb4a3ae43b83",
035
"type": "pulumi:providers:aws",
036
"inputs": {
037
"region": "ap-northeast-1",
038
"skipCredentialsValidation": "false",
039
"skipMetadataApiCheck": "true",
040
"skipRegionValidation": "true",
041
"version": "6.2.1"
042
},
043
"outputs": {
044
"region": "ap-northeast-1",
045
"skipCredentialsValidation": "false",
046
"skipMetadataApiCheck": "true",
047
"skipRegionValidation": "true",
048
"version": "6.2.1"
049
},
050
"created": "2023-09-28T08:14:40.485069Z",
051
"modified": "2023-09-28T08:14:40.485069Z"
052
},
053
{
054
"urn": "urn:pulumi:dev::pulumi-import::aws:s3/bucket:Bucket::my-bucket-pulumi",
055
"custom": true,
056
"id": "my-bucket-pulumi",
057
"type": "aws:s3/bucket:Bucket",
058
"inputs": {
059
"__defaults": [
060
"acl",
061
"bucket",
062
"forceDestroy"
063
],
064
"acl": "private",
065
"bucket": "my-bucket-pulumi",
066
"forceDestroy": false
067
},
068
"outputs": {
069
"accelerationStatus": "",
070
"arn": "arn:aws:s3:::my-bucket-pulumi",
071
"bucket": "my-bucket-pulumi",
072
"bucketDomainName": "my-bucket-pulumi.s3.amazonaws.com",
073
"bucketRegionalDomainName": "my-bucket-pulumi.s3.ap-northeast-1.amazonaws.com",
074
"corsRules": [],
075
"grants": [],
076
"hostedZoneId": "Z2M4EHUR26P7ZW",
077
"id": "my-bucket-pulumi",
078
"lifecycleRules": [],
079
"loggings": [],
080
"objectLockConfiguration": null,
081
"region": "ap-northeast-1",
082
"replicationConfiguration": null,
083
"requestPayer": "BucketOwner",
084
"serverSideEncryptionConfiguration": {
085
"rule": {
086
"applyServerSideEncryptionByDefault": {
087
"kmsMasterKeyId": "",
088
"sseAlgorithm": "AES256"
089
},
090
"bucketKeyEnabled": true
091
}
092
},
093
"versioning": {
094
"enabled": false,
095
"mfaDelete": false
096
},
097
"website": null
098
},
099
"parent": "urn:pulumi:dev::pulumi-import::pulumi:pulumi:Stack::pulumi-import-dev",
100
"provider": "urn:pulumi:dev::pulumi-import::pulumi:providers:aws::default_6_2_1::b4c8a4e5-e5ce-4b35-88ae-fb4a3ae43b83",
101
"additionalSecretOutputs": [
102
"tagsAll"
103
],
104
"importID": "my-bucket-pulumi",
105
"created": "2023-09-28T08:14:41.418829Z",
106
"modified": "2023-09-28T08:14:41.418829Z"
107
}
108
]
109
}
110
}
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- PulumiでAWSリソースをデプロイしよう
- 「Pulumi Stack」とは ー Pulumiによるマルチステージ環境の構築方法
- TerraformからPulumiへの移行
- SecretもPulumiで使いこなしたい! PulumiのSecurityを試してみよう
- 「Pulumi Automation API」でPulumi CLIの機能をコード化しよう
- Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう
- Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
- Oracle Cloud Hangout Cafe Season7 #2「IaC のベストプラクティス」(2023年7月5日開催)
- TFXを使った機械学習パイプラインの構築(実装編その1)
- TFXを使った機械学習パイプラインの構築(デプロイ編)