6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AliEaters Code支部#2: [ハンズオン資料]サルでもわかるアリババのサーバーレス

Last updated at Posted at 2019-08-31

はじめ

このQiita記事はAliEaters Code支部#2の説明資料になります。
※ AliEaters Code支部はAlibaba Cloudの開発者に特化したユーザー会であり、aliyuncli、sdk、Alibaba Cloud関連の開発ツールを利用して、ハンズオンでAlibaba Cloudを使い倒すコミュニティです。

また、下記AliEaters Code支部の活動履歴になります。
【 1 】AliEaters Code支部#1: 【初心者向け】Alibaba Cloud CLIハンズオン
   ※ ハンズオン資料 [Alibaba Cloud] VPC + ECS作成ハンズオン

AliEaters Code支部#2で取り扱うトピック or 課題: リソース管理

運用ルールが定まっておらず、クラウド環境(特に検証環境とか)に大量な作成者不明のリソースがあり、「リソースの上限にひかかってしまった」「この仮想サーバーを削除していいかどうかわからない」など、アカウント管理者が困ってしまう問題が少なくありません。
Alibaba Cloudでは、ServelessのプロダクトFunction Computeを中心に、ActionTrail、OSS、RAMと連携して、リソースが作成されると同時に、作成者の情報を作成されるリソースに自動的にTagをつける仕組みがあります。

本Qiita記事では、Alibaba CloudのPythonSDKを利用して、ECS Instances(仮想サーバー)が作成されたら、自動的にTag付けの仕組みを構築します。

利用するAlibaba Cloudのプロダクト, SDK

  1. Security Token Service -> STS
    一時的にAlibaba Cloudを操作する権限をToken形式で提供するサービス
  2. Object Storage Service -> OSS
    非構造化データを安全・安価で保存できるオーブジェクトストレージサービス
    - Bucket / Object
    - Trigger
  3. Resource Access Management -> RAM
    Alibaba Cloudの認証/認可サービス
     - Role (Service Role) : 今回利用するActionTrailやFunction Computeなどのプロダクトが指定したRoleを利用することで、一時的に別サービスを操作できる機能
     - Policy : Alibaba Cloudを操作する権限
  4. ActionTrail
    Alibaba Cloud上の操作を記録するサービス
  5. Function Compute -> FC
    ユーザーが仮想サーバーを作る必要がなく、プログラムを実行してくれるサービス
    - Service : Functionの集まり

     - Function : 実行したいプログラム
  6. Virtual Private Cloud -> VPC
    クラウド上隔離されたネットワーク環境を作成できるサービス
    - VSwitch : サブネット
  7. Elastic Compute Service -> ECS
    仮想サーバー
    - Security Group : 仮想Firewall
    - Instance : 仮想サーバー
  8. Alibaba Cloud Python SDK
     - SDK集(Alibaba Cloud 国際サイト) ※ 情報がやや少なめ
     - SDK集(Alibaba Cloud 中国サイト) - 阿里云开发工具包(SDK)

アーキテクチャ

image.png

動作するフロー

  1. UserがECSインスタンスを1つ以上作成する

  2. ECS Instances作成のEventがActionTrailに反映される

     - (RunInstancesの)ActionTrailログのサンプル

  3. ActionTrailは定期的に操作ログのzipファイルをOSS Bucektに保存する

  4. 操作ログのzipファイルがOSS Bucketに保存されると同時に、OSS Triggerが起動され、Function ComputeにEventを通知する
    - OSS Triggerの中身のサンプル

  5. Function ComputeはOSSからのEvent情報を基づいて、対象のActionTrailログのzipを取得する

  6. Function ComputeはActionTrailログ情報に基づいて、対象のECS InstancesにOwner Tagをつける

デモ動画 → https://youtu.be/l3ZSbflM_Zk
※ 約1分30秒

ハンズオンの流れ

下記4つのフェーズに分かれて、ハンズオンを進めていきます。

0: 諸環境の準備フェーズ
1: 構築フェーズ
    1.1: APIコールのClientの作成
    1.2: Alibaba Cloudの AccountIDの取得と確認
    1.3: OSS関連の作業
    1.4: RAM関連の作業
    1.5: ActionTrail関連の作業
    1.6: FC関連の作業
2: 動作確認フェーズ
    2.1: VPC関連の作業
    2.2: ECS関連の作業
3: 片付けフェーズ
    3.1: ECS関連の作業
    3.2: VPC関連の作業
    3.3: FC関連の作業
    3.4: ActionTrail関連作業
    3.5: OSS関連作業
    3.6: RAM関連作業

各ステップの作業については、基本的に下記の構成に従って記載しています。

- 作業内容
- 超雑な利用APIの情報
- 実行するコマンド
- 出力結果例

ハンズオン手順

0: 諸環境の準備フェーズ

0.1: 利用するプロダクトの有効化

下記、まだ有効化されていないプロダクトがあれば、有効化を行います。

0.2: ハンズオン専用のRAM Userの作成 / アクセスキーの作成 / 権限付与

  1. 【RAMユーザーの作成】を参考に、ハンズオン専用のRAM Userを作成します。
  2. 【RAM ユーザーへの権限付与】を参考に、下記の権限を作成したRAM Userに付与します。
  • AliyunRAMFullAccess
  • AliyunOSSFullAccess
  • AliyunActionTrailFullAccess
  • AliyunFCFullAccess
  • AliyunVPCFullAccess
  • AliyunECSFullAccess
  1. 【AccessKeyの作成】を参考に、ハンズオン専用のAccessKeyを作成します。
    ※ 作成されたAccessKeyとSecretKeyの情報をどっかで保存し、取り扱いに注意しましょう!

0.3: Pythonプログラム実行環境の準備

0.3.1 AliEaters Code支部運営側が提供するJupyter環境へアクセス

オレオレ証明書を利用しているため、警告が出ますので、ご了承ください

環境:
- Python 3.7.3
- oss2 2.8.0
- aliyun-fc2 2.2.0
- aliyun-python-sdk-core 2.6.0
- aliyun-python-sdk-actiontrail 1.0.0
- aliyun-python-sdk-ram 3.0.0
- aliyun-python-sdk-sts 3.0.0
- aliyun-python-sdk-vpc 3.0.2
- aliyun-python-sdk-ecs 4.9.0

image.png

運用側が提供する環境を利用しない場合は、各自のpython実行環境で下記のコマンドを実行して、aliyun python sdkのインストールをお願いします。


pip install aliyun-python-sdk-core oss2 aliyun-python-sdk-actiontrail aliyun-python-sdk-ram aliyun-python-sdk-sts aliyun-fc2 aliyun-python-sdk-vpc aliyun-python-sdk-ecs

0.3.2 Jupyter環境にログイン後の画面

image.png

0.3.3 workディレクトリ配下に移動とPythonファイルの作成

code.zipはのちほどFunction Computeを作成する際に利用します。

image.png

image.png

1: 構築フェーズ

1.1: APIコールのClientの作成

AcsClient

コマンド:

#########################################
# APIコールのClientの作成
#########################################
from aliyunsdkcore.client import AcsClient

REGION = "ap-northeast-1"
ACCESS_KEY_ID = "< Your Access Key ID >"
ACCESS_KEY_SECRET = "< Your Secret Key >"
client = AcsClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET, REGION)

出力結果例:

なし

1.2: Alibaba Cloudの AccountIDの取得と確認

呼び出し元のIDの取得(GetCallerIdentity)

コマンド:

#########################################
# AccountIDの取得
#########################################
import json
from aliyunsdksts.request.v20150401.GetCallerIdentityRequest import GetCallerIdentityRequest

request = GetCallerIdentityRequest()
request.set_accept_format('json')
response = json.loads(client.do_action_with_exception(request))

# ACCOUNT_IDの確認
ACCOUNT_ID = response["AccountId"]
print("AccountId = " , ACCOUNT_ID)

出力結果例:

AccountId =  5644*******6921

1.3: OSS関連の作業

0: 諸環境の準備フェーズ
1: 構築フェーズ
    1.1: APIコールのClientの作成
    1.2: Alibaba Cloudの AccountIDの取得と確認
    1.3: OSS関連の作業   <------------------------------------------------- 今ここ
    1.4: RAM関連の作業
    1.5: ActionTrail関連の作業
    1.6: FC関連の作業
2: 動作確認フェーズ
    2.1: VPC関連の作業
    2.2: ECS関連の作業
3: 片付けフェーズ
    3.1: ECS関連の作業
    3.2: VPC関連の作業
    3.3: FC関連の作業
    3.4: ActionTrail関連作業
    3.5: OSS関連作業
    3.6: RAM関連作業

image.png

1.3.0: OSS とは

Alibaba Cloud Object Storage Service (OSS) は、大容量のデータを格納、バックアップ、アーカイブできるクラウドオブジェクトストレージサービスです。安全性、コスト効率、操作性に優れ、99.999999999% のデータ信頼性を保証しています。

1.3.1: ActionTrailのログ保存用のBucketの作成

Bucket
Auth
create_bucket
oss2のサンプルコード集

コマンド:

#########################################
# OSS
#  ActionTrail用のOSS Bucketの作成
#########################################
import oss2

# ユニークなOSS Bucket名にする必要がある
OSS_BUCKET = "action-trail-log" + "-" +  ACCOUNT_ID
OSS_ENDPOINT = "oss-ap-northeast-1.aliyuncs.com"

bucket = oss2.Bucket(oss2.Auth(ACCESS_KEY_ID, ACCESS_KEY_SECRET), OSS_ENDPOINT, OSS_BUCKET)
bucket.create_bucket(permission=oss2.BUCKET_ACL_PRIVATE,
                     input=oss2.models.BucketCreateConfig(oss2.BUCKET_STORAGE_CLASS_STANDARD))

出力結果例:

<oss2.models.RequestResult at 0x7f772d640828>

1.3.2: ActionTrailのログ保存用のBucketの確認

get_bucket_info

コマンド:

# 作成したOSS Bucketの確認
bucket_info = bucket.get_bucket_info()
print('name: ' + bucket_info.name)
print('storage class: ' + bucket_info.storage_class)
print('creation date: ' + bucket_info.creation_date)

出力結果例:

name: action-trail-log-5644******6921
storage class: Standard
creation date: 2019-08-26T05:10:22.000Z

image.png

1.4: RAM関連の作業

0: 諸環境の準備フェーズ
1: 構築フェーズ
    1.1: APIコールのClientの作成
    1.2: Alibaba Cloudの AccountIDの取得と確認
    1.3: OSS関連の作業   
    1.4: RAM関連の作業   <------------------------------------------------- 今ここ
    1.5: ActionTrail関連の作業
    1.6: FC関連の作業
2: 動作確認フェーズ
    2.1: VPC関連の作業
    2.2: ECS関連の作業
3: 片付けフェーズ
    3.1: ECS関連の作業
    3.2: VPC関連の作業
    3.3: FC関連の作業
    3.4: ActionTrail関連作業
    3.5: OSS関連作業
    3.6: RAM関連作業

image.png

1.4.0: RAM とは

Alibaba Cloud Resource Access Management (RAM) は、ユーザーとそのアクセス権限を制御するサービスです。このサービスにより、ユーザー (従業員、システム、アプリケーションなど) を一元管理して、権限レベルによりリソースへのアクセスを安全に制御できます。

1.4.1: ActionTrail用のRAM Roleの事前確認

ロールの取得 (GetRole)

コマンド:

###############################################################
# RAM Role
#  ActionTrail用のRAM Roleの作成、信頼関係の付与、RAM Policyの付与
###############################################################
from aliyunsdkram.request.v20150501.CreateRoleRequest import CreateRoleRequest
from aliyunsdkram.request.v20150501.GetRoleRequest import GetRoleRequest
from aliyunsdkram.request.v20150501.AttachPolicyToRoleRequest import AttachPolicyToRoleRequest
from aliyunsdkram.request.v20150501.ListPoliciesForRoleRequest import ListPoliciesForRoleRequest

# 変数の準備
#  ActionTrail は AliyunActionTrailDefaultRoleを利用して、
#  ログファイルを指定されたOSS Bucketに保存する
ACTION_TRAIL_ROLE = "AliyunActionTrailDefaultRole"

# 指定したRoleの存在確認、存在しない場合はエラー表示
# 想定結果: Error:EntityNotExist.Role
request = GetRoleRequest()
request.set_accept_format('json')
request.set_RoleName(ACTION_TRAIL_ROLE)

response = json.loads(client.do_action_with_exception(request))
print(json.dumps(response, indent=4, sort_keys=True))

出力結果例(存在しない場合):


---------------------------------------------------------------------------
ServerException                           Traceback (most recent call last)
<ipython-input-6-bd1c8ab3229f> in <module>
     17 request.set_RoleName(ACTION_TRAIL_ROLE)
     18 
---> 19 response = json.loads(client.do_action_with_exception(request))
     20 print(json.dumps(response, indent=4, sort_keys=True))

/opt/conda/lib/python3.7/site-packages/aliyunsdkcore/client.py in do_action_with_exception(self, acs_request)
    427 
    428         if exception:
--> 429             raise exception
    430         logger.debug('Response received. Product:%s Response-body: %s',
    431                      acs_request.get_product(), body)

ServerException: HTTP Status: 404 Error:EntityNotExist.Role The role not exists:AliyunActionTrailDefaultRole RequestID: F2F22F29-E970-4EC0-A34A-A7452006D404

image.png

出力結果例(存在する場合):

[注意] AliyunActionTrailDefaultRole が存在する場合、 1.4.2 ~ 1.4.4 の作業はスキップしてください

{
    "RequestId": "92448093-95EC-487F-8008-C92A92F13F94",
    "Role": {
        "Arn": "acs:ram::5644*****946921:role/aliyunactiontraildefaultrole",
        "AssumeRolePolicyDocument": "{\n    \"Statement\": [{\n            \"Action\": \"sts:AssumeRole\",\n            \"Effect\": \"Allow\",\n            \"Principal\": {\"Service\": [\"actiontrail.aliyuncs.com\"]}}],\n    \"Version\": \"1\"}",
        "CreateDate": "2019-08-29T09:20:41Z",
        "Description": "",
        "RoleId": "337882913879459285",
        "RoleName": "AliyunActionTrailDefaultRole"
    }
}

1.4.2: ActionTrail用のRAM Roleの作成、信頼関係の付与

ロールの作成 (CreateRole)

コマンド:

# Roleの作成、信頼関係の付与
#  信頼関係がないと、ActionTrailが AliyunActionTrailDefaultRole を利用できない
request = CreateRoleRequest()
request.set_accept_format('json')
request.set_RoleName(ACTION_TRAIL_ROLE)
ASSUME_ROLE_POLICY_DOCUMENT = '''
{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "actiontrail.aliyuncs.com"
        ]
      }
    }
  ],
  "Version": "1"
}
'''
request.set_AssumeRolePolicyDocument(ASSUME_ROLE_POLICY_DOCUMENT)

response = json.loads(client.do_action_with_exception(request))
print(json.dumps(response["Role"], indent=4, sort_keys=True))

出力結果例:

{
    "Arn": "acs:ram::564******921:role/aliyunactiontraildefaultrole",
    "AssumeRolePolicyDocument": "{\n    \"Statement\": [{\n            \"Action\": \"sts:AssumeRole\",\n            \"Effect\": \"Allow\",\n            \"Principal\": {\"Service\": [\"actiontrail.aliyuncs.com\"]}}],\n    \"Version\": \"1\"}",
    "CreateDate": "2019-08-26T05:14:32Z",
    "Description": "",
    "RoleId": "305293459411671622",
    "RoleName": "AliyunActionTrailDefaultRole"
}

image.png

1.4.3: ActionTrail用のRAM RoleにPolicyの付与

ロールに権限付与ポリシーをアタッチ(AttachPolicyToRole)

コマンド:

# 作成したRoleにPolicyの付与
#  ActionTrailがログファイルを保存する際にOSSを操作する権限が必要
request = AttachPolicyToRoleRequest()
request.set_accept_format('json')
request.set_PolicyType("System")
request.set_PolicyName("AliyunActionTrailRolePolicy")
request.set_RoleName(ACTION_TRAIL_ROLE)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"7A2BC976-295A-4E3D-9B7E-EF9D2E652EAA"}

1.4.4: ActionTrail用のRAM Roleに付与されたPolicyの確認

ロールに付与された権限付与ポリシーの一覧表示(ListPoliciesForRole)

コマンド:

# 指定したRoleにPolicyを付与したかの確認
request = ListPoliciesForRoleRequest()
request.set_accept_format('json')
request.set_RoleName("AliyunActionTrailDefaultRole")

response = json.loads(client.do_action_with_exception(request))
print(json.dumps(response, indent=4, sort_keys=True))

出力結果例:

{
    "Policies": {
        "Policy": [
            {
                "AttachDate": "2019-08-26T05:14:47Z",
                "DefaultVersion": "v3",
                "Description": "\u7528\u4e8eActionTrail\u670d\u52a1\u9ed8\u8ba4\u89d2\u8272\u7684\u6388\u6743\u7b56\u7565\uff0c\u5305\u62ecOSS\u7684\u5bf9\u8c61\u5217\u51fa\u53ca\u5199\u5165\u6743\u9650",
                "PolicyName": "AliyunActionTrailRolePolicy",
                "PolicyType": "System"
            }
        ]
    },
    "RequestId": "80B2F78F-D157-4883-896C-212674EDCAB4"
}

image.png

1.4.5: Function Compute用のRAM Roleの作成、信頼関係の付与

コマンド:

###############################################################
# RAM Role
#  Function Compute用のRAM Roleの作成、信頼関係の付与、RAM Policyの付与
###############################################################

# 変数の準備
FC_ROLE = "fc-role"

# Roleの作成、信頼関係の付与
request = CreateRoleRequest()
request.set_accept_format('json')
request.set_RoleName(FC_ROLE)
ASSUME_ROLE_POLICY_DOCUMENT = '''
{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "fc.aliyuncs.com"
        ]
      }
    }
  ],
  "Version": "1"
}
'''
request.set_AssumeRolePolicyDocument(ASSUME_ROLE_POLICY_DOCUMENT)

response = json.loads(client.do_action_with_exception(request))
print(json.dumps(response["Role"], indent=4, sort_keys=True))

出力結果例:


{
    "Arn": "acs:ram::5644*****6921:role/fc-role",
    "AssumeRolePolicyDocument": "{\n    \"Statement\": [{\n            \"Action\": \"sts:AssumeRole\",\n            \"Effect\": \"Allow\",\n            \"Principal\": {\"Service\": [\"fc.aliyuncs.com\"]}}],\n    \"Version\": \"1\"}",
    "CreateDate": "2019-08-26T05:16:17Z",
    "Description": "",
    "RoleId": "3296*****9088489",
    "RoleName": "fc-role"
}

image.png
image.png

1.4.6: Function Compute用のRoleにPolicy(AliyunOSSFullAccess)の付与

コマンド:

# 作成したRoleにPolicy(AliyunOSSFullAccess)の付与
request = AttachPolicyToRoleRequest()
request.set_accept_format('json')
request.set_PolicyType("System")
request.set_PolicyName("AliyunOSSFullAccess")
request.set_RoleName(FC_ROLE)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"FDE146EA-2377-46DF-8628-8578B0F10C95"}

1.4.7: Function Compute用のRoleにPolicy(AliyunECSFullAccess)の付与

コマンド:

# 作成したRoleにPolicy(AliyunECSFullAccess)の付与
request.set_PolicyName("AliyunECSFullAccess")

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"73816F3A-9EC6-43AE-80B1-33A699D38BD7"}

1.4.8: Function Compute用のRoleにPolicyを付与したかの確認

コマンド:

# 指定したRoleにPolicyを付与したかの確認
request = ListPoliciesForRoleRequest()
request.set_accept_format('json')
request.set_RoleName(FC_ROLE)

response = json.loads(client.do_action_with_exception(request))
print(json.dumps(response, indent=4, sort_keys=True))

出力結果例:

{
    "Policies": {
        "Policy": [
            {
                "AttachDate": "2019-08-30T04:45:08Z",
                "DefaultVersion": "v1",
                "Description": "\u7ba1\u7406\u5bf9\u8c61\u5b58\u50a8\u670d\u52a1(OSS)\u6743\u9650",
                "PolicyName": "AliyunOSSFullAccess",
                "PolicyType": "System"
            },
            {
                "AttachDate": "2019-08-30T04:46:12Z",
                "DefaultVersion": "v2",
                "Description": "\u7ba1\u7406\u4e91\u670d\u52a1\u5668\u670d\u52a1(ECS)\u7684\u6743\u9650",
                "PolicyName": "AliyunECSFullAccess",
                "PolicyType": "System"
            }
        ]
    },
    "RequestId": "D3222802-FC86-4FA2-9354-584EC150702B"
}

image.png

1.4.9: OSS Trigger用のRoleの作成

コマンド:

###############################################################
# OSS Trigger Role
#  OSS Trigger用のRAM Roleの作成、信頼関係の付与、RAM Policyの付与
###############################################################

# 変数の準備
OSS_INVOCATION_ROLE = "AliyunOSSEventNotificationRole"

# Roleの作成、信頼関係の付与
request = CreateRoleRequest()
request.set_accept_format('json')
request.set_RoleName(OSS_INVOCATION_ROLE)
ASSUME_ROLE_POLICY_DOCUMENT = '''
{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "oss.aliyuncs.com"
        ]
      }
    }
  ],
  "Version": "1"
}
'''
request.set_AssumeRolePolicyDocument(ASSUME_ROLE_POLICY_DOCUMENT)

response = json.loads(client.do_action_with_exception(request))
OSS_INVOCATION_ROLE_ARN = response["Role"]["Arn"]
print("OSS_INVOCATION_ROLE_ARN : ", OSS_INVOCATION_ROLE_ARN)

出力結果例:

OSS_INVOCATION_ROLE_ARN :  acs:ram::5644*****46921:role/aliyunosseventnotificationrole

image.png
image.png

1.4.10: OSS Trigger用のRoleにPolicy(AliyunOSSEventNotificationRolePolicy)の付与

コマンド:

# 作成したRoleにPolicy(AliyunOSSEventNotificationRolePolicy)の付与
request = AttachPolicyToRoleRequest()
request.set_accept_format('json')
request.set_PolicyType("System")
request.set_PolicyName("AliyunOSSEventNotificationRolePolicy")
request.set_RoleName(OSS_INVOCATION_ROLE)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"274AEBFB-9141-4204-BE97-D02B9F2C2262"}

1.4.11: OSS Trigger用のRoleにPolicyを付与したかの確認

コマンド:

# 指定したRoleにPolicyを付与したかの確認
request = ListPoliciesForRoleRequest()
request.set_accept_format('json')
request.set_RoleName(OSS_INVOCATION_ROLE)

response = json.loads(client.do_action_with_exception(request))
print(json.dumps(response, indent=4, sort_keys=True))

出力結果例:

{
    "Policies": {
        "Policy": [
            {
                "AttachDate": "2019-08-26T05:40:32Z",
                "DefaultVersion": "v1",
                "Description": "\u7528\u4e8eOSS\u670d\u52a1\u4e8b\u4ef6\u901a\u77e5\u529f\u80fd\u89d2\u8272\u7684\u6388\u6743\u7b56\u7565",
                "PolicyName": "AliyunOSSEventNotificationRolePolicy",
                "PolicyType": "System"
            }
        ]
    },
    "RequestId": "0310E003-9415-4BC3-ADE7-9BDB85B2CA67"
}

image.png

1.5: ActionTrail関連の作業

0: 諸環境の準備フェーズ
1: 構築フェーズ
    1.1: APIコールのClientの作成
    1.2: Alibaba Cloudの AccountIDの取得と確認
    1.3: OSS関連の作業   
    1.4: RAM関連の作業   
    1.5: ActionTrail関連の作業  <------------------------------------------------- 今ここ
    1.6: FC関連の作業
2: 動作確認フェーズ
    2.1: VPC関連の作業
    2.2: ECS関連の作業
3: 片付けフェーズ
    3.1: ECS関連の作業
    3.2: VPC関連の作業
    3.3: FC関連の作業
    3.4: ActionTrail関連作業
    3.5: OSS関連作業
    3.6: RAM関連作業

image.png

1.5.0: ActionTrail とは

ActionTrail は、リソースの操作履歴の記録、操作履歴の検索、操作履歴の OSS バケットへの保存が可能です。操作履歴を分析することで、リソースの変更管理はもちろん、セキュリティ管理やコンプライアンス監査にも対応できます。

1.5.1: ActionTrailの確認

DescribeTrails

コマンド:

###############################################################
# ActionTrail
#  ActionTrailの作成、OSS Bucketの設定、ActionTraioの有効化
###############################################################
from aliyunsdkactiontrail.request.v20171204.CreateTrailRequest import CreateTrailRequest
from aliyunsdkactiontrail.request.v20171204.StartLoggingRequest import StartLoggingRequest
from aliyunsdkactiontrail.request.v20171204.DescribeTrailsRequest import DescribeTrailsRequest

# 変数の準備
ACTION_TRAIL = "audit-trail" # Your ActionTrail
ACTION_TRAIL_ROLE = "AliyunActionTrailDefaultRole"

# ActionTrailの確認
request = DescribeTrailsRequest()
request.set_accept_format('json')

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例(存在しない場合):

[注意] TrailListが空きでない場合は、すでにTrailが存在しているため、1.5.2 ~ 1.5.5までの手順をご確認していただいて、足りていない部分のみ対応してください

{"TrailList":[],"RequestId":"DEACF710-5F24-46CF-A918-B2A62F043F19"}

1.5.2: ActionTrailの作成

CreateTrail

コマンド:

request = CreateTrailRequest()
request.set_accept_format('json')
request.set_Name(ACTION_TRAIL)
request.set_OssBucketName(OSS_BUCKET)
request.set_RoleName(ACTION_TRAIL_ROLE)

response = json.loads(client.do_action_with_exception(request))
print(json.dumps(response, indent=4, sort_keys=True))

出力結果例:

{
    "EventRW": "Write",
    "HomeRegion": "ap-northeast-1",
    "Name": "audit-trail",
    "OssBucketName": "action-trail-log-56443******921",
    "RequestId": "CAA3916C-7614-4C5B-84A7-91B03656078E",
    "RoleName": "aliyunactiontraildefaultrole"
}

1.5.3: 作成したActionTrailの確認

DescribeTrails

コマンド:

# ActionTrailの確認、デフォルトはStatus無効(Fresh)になっている
request = DescribeTrailsRequest()
request.set_accept_format('json')

response = json.loads(client.do_action_with_exception(request))
print(json.dumps(response["TrailList"][0], indent=4, sort_keys=True))

出力結果例:

{
    "EventRW": "Write",
    "HomeRegion": "ap-northeast-1",
    "IncludeGlobalServiceEvent": true,
    "Name": "audit-trail",
    "OssBucketName": "action-trail-log-56443********921",
    "OssKeyPrefix": "",
    "Region": "ap-northeast-1",
    "RoleName": "aliyunactiontraildefaultrole",
    "SlsProjectArn": "",
    "SlsWriteRoleArn": "",
    "Status": "Fresh",
    "Type": "Action"
}

image.png

1.5.4: 作成したActionTrailの有効化

StartLogging

コマンド:

request = StartLoggingRequest()
request.set_accept_format('json')
request.set_Name(ACTION_TRAIL)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"D8CD1E8A-DDFF-42EC-ABB8-059D83EC8075"}

1.5.5: 作成したActionTrailの確認, Statusの確認

DescribeTrails

コマンド:

# ActionTrailのStatusの確認、Statusが Fresh -> Enable
request = DescribeTrailsRequest()
request.set_accept_format('json')

response = json.loads(client.do_action_with_exception(request))
print(json.dumps(response["TrailList"][0], indent=4, sort_keys=True))

出力結果例:

{
    "EventRW": "Write",
    "HomeRegion": "ap-northeast-1",
    "IncludeGlobalServiceEvent": true,
    "Name": "audit-trail",
    "OssBucketName": "action-trail-log-564*****6921",
    "OssKeyPrefix": "",
    "Region": "ap-northeast-1",
    "RoleName": "aliyunactiontraildefaultrole",
    "SlsProjectArn": "",
    "SlsWriteRoleArn": "",
    "Status": "Enable",
    "Type": "Action"
}

image.png

1.6: FC関連の作業

0: 諸環境の準備フェーズ
1: 構築フェーズ
    1.1: APIコールのClientの作成
    1.2: Alibaba Cloudの AccountIDの取得と確認
    1.3: OSS関連の作業   
    1.4: RAM関連の作業   
    1.5: ActionTrail関連の作業  
    1.6: FC関連の作業  <------------------------------------------------- 今ここ
2: 動作確認フェーズ
    2.1: VPC関連の作業
    2.2: ECS関連の作業
3: 片付けフェーズ
    3.1: ECS関連の作業
    3.2: VPC関連の作業
    3.3: FC関連の作業
    3.4: ActionTrail関連作業
    3.5: OSS関連作業
    3.6: RAM関連作業

image.png

1.6.0: FC とは

Alibaba Cloud Function Compute はイベント駆動型のフルマネージドコンピューティングサービスです。お客様はサーバーなどインフラストラクチャを管理する必要がなくなりコーディングに集中できます。
Function Compute はコンピューティングリソースを提供し、柔軟かつ信頼性の高い方式でコードを実行できます。またコード実行時支払う必要があるのは消費したリソースの分だけで、コードを実行しなければ料金は発生しません。

1.6.1: 変数の準備とFC Clientの作成

fc2.Client

コマンド:

###############################################################
# Function Compute
#  Serviceの作成、Functionの作成、OSS Triggerの作成
###############################################################
import fc2

# 変数の準備
FC_ENDPOINT = "https://" + ACCOUNT_ID + "." + REGION + ".fc.aliyuncs.com" # Function Compute Endpoint
ROLE_ARN = "acs:ram::"+ ACCOUNT_ID +":role/fc-role" # Function Compute Role ARN
FC_SERVICE = "resource_management" # Function Compute Service Name
FC_FUNCTION = "fc_function" # Function Compute Function Name

# FC Clientの作成
fc_client = fc2.Client(
    endpoint=FC_ENDPOINT,
    accessKeyID=ACCESS_KEY_ID,
    accessKeySecret=ACCESS_KEY_SECRET
    )

出力結果例:

なし

1.6.2: FC Serviceの作成

CreateService
Service

list_services

コマンド:

# FC Serviceの作成
service = fc_client.create_service(serviceName=FC_SERVICE, role=ROLE_ARN)

response = fc_client.list_services()
for service in response.data["services"]:
    print("Function compute : ", service["serviceName"])

出力結果例:

Function compute :  resource_management
Function compute :  *********

image.png

1.6.3: FC Functionの作成

create_function

FC Functionのプログラム

※ 運営側が提供されるJupyter環境を利用しない場合は Function Compute用のcode.zip をカレントディレクトリに保存してください。

コマンド:

# FC Functionの作成
# service, function, rumtime, event handler, codeのpath を設定する必要がある
response = fc_client.create_function(
                                    FC_SERVICE, 
                                    FC_FUNCTION, 
                                    'python3', 
                                    'index.handler', 
                                    codeZipFile = 'code.zip',
                                    environmentVariables = {'TAG_NAME': 'Owner'}
                                    )
# 確認
print(json.dumps(response.data, indent=4, sort_keys=True))

出力結果例:

{
    "codeChecksum": "13189467078313270400",
    "codeSize": 1274,
    "concurrencyLimit": 1,
    "createdTime": "2019-08-26T05:56:48Z",
    "description": "",
    "environmentVariables": {
        "TAG_NAME": "Owner"
    },
    "functionId": "18401af3-71ec-49d3-b3a8-e04fbf3581ef",
    "functionName": "fc_function",
    "handler": "index.handler",
    "initializationTimeout": 30,
    "initializer": null,
    "lastModifiedTime": "2019-08-26T05:56:48Z",
    "memorySize": 256,
    "runtime": "python3",
    "timeout": 60
}

image.png

image.png

1.6.4: OSS Triggerの作成

CreateTrigger

OSS Triggerの中身のサンプル

コマンド:

# OSS Triggerの作成
#  trigger名,triggerの種類, 対象の操作event(今回は oss:ObjectCreated:PutObject ), 
#  対象のOSS Bucket, OSS用のRAM Roleを指定する必要がある
OSS_TRIGGER = "oss-trigger"
OSS_TRIGGER_CONFIG = {"events": ["oss:ObjectCreated:PutObject"]}
OSS_SOURCE_ARN = "acs:oss:ap-northeast-1:" + ACCOUNT_ID + ":" + OSS_BUCKET
TRIGGER_TYPE = "oss"

response = fc_client.create_trigger(
                                    FC_SERVICE, 
                                    FC_FUNCTION, 
                                    OSS_TRIGGER, 
                                    TRIGGER_TYPE,
                                    OSS_TRIGGER_CONFIG, 
                                    OSS_SOURCE_ARN, 
                                    OSS_INVOCATION_ROLE_ARN
                                )
# 確認
print(json.dumps(response.data, indent=4, sort_keys=True))

出力結果例:

{
    "createdTime": "2019-08-26T05:57:14Z",
    "description": "",
    "invocationRole": "acs:ram::564*******46921:role/aliyunosseventnotificationrole",
    "lastModifiedTime": "2019-08-26T05:57:14Z",
    "qualifier": null,
    "sourceArn": "acs:oss:ap-northeast-1:564*******6921:action-trail-log-5644********921",
    "triggerConfig": {
        "events": [
            "oss:ObjectCreated:PutObject"
        ],
        "filter": {
            "key": {
                "prefix": "",
                "suffix": ""
            }
        }
    },
    "triggerId": "c5478f0b-91cc-4231-8d19-3738dc3a01e5",
    "triggerName": "oss-trigger",
    "triggerType": "oss"
}

image.png

2: 動作確認フェーズ

2.1: VPC関連の作業

0: 諸環境の準備フェーズ
1: 構築フェーズ
    1.1: APIコールのClientの作成
    1.2: Alibaba Cloudの AccountIDの取得と確認
    1.3: OSS関連の作業   
    1.4: RAM関連の作業   
    1.5: ActionTrail関連の作業  
    1.6: FC関連の作業  
2: 動作確認フェーズ
    2.1: VPC関連の作業  <------------------------------------------------- 今ここ
    2.2: ECS関連の作業
3: 片付けフェーズ
    3.1: ECS関連の作業
    3.2: VPC関連の作業
    3.3: FC関連の作業
    3.4: ActionTrail関連作業
    3.5: OSS関連作業
    3.6: RAM関連作業

image.png

2.1.0: VPC とは

Alibaba Cloud Virtual Private Cloud (VPC) では、クラウド上で分離されたネットワークを構築して、外部からのアクセスが制限された安全で環境でリソースを運用できます。独自の IP アドレス範囲を選択し、ルーティングテーブルとネットワークゲートウェイを設定して、ネットワークを制御できます。オンプレミスのネットワークを VPC に接続することでリソースを増強し、Alibaba Cloud をデータセンターの拡張機能のソリューションとして活用できます。

2.1.1: VPCの作成

CreateVpc

コマンド:

###############################################################
# VPC
#   VPC, VSwitchの作成
###############################################################

# VPCの作成
from aliyunsdkvpc.request.v20160428.CreateVpcRequest import CreateVpcRequest

request = CreateVpcRequest()
request.set_accept_format('json')
# CidrBlockが重複した場合はエラーなる
request.set_CidrBlock("172.16.0.0/12")
response = json.loads(client.do_action_with_exception(request))

# 確認
VPC_ID = response["VpcId"]
print("VPC_ID : ", VPC_ID)
print("\n")
print(json.dumps(response, indent=4, sort_keys=True))

出力結果例:

VPC_ID : vpc-6weel8******m8wr5de


{
    "RequestId": "6625BD2B-9778-463D-BF73-948499224933",
    "ResourceGroupId": "rg-acfnwmebvyioq2i",
    "RouteTableId": "vtb-6wetp1kgb16sdhi47qhv8",
    "VRouterId": "vrt-6wejcqgmwnbsx5lfe5xpv",
    "VpcId": "vpc-6weel8******m8wr5de"
}

image.png

2.1.2: VSwithの作成

CreateVSwitch

コマンド:

# VSwithの作成
from aliyunsdkvpc.request.v20160428.CreateVSwitchRequest import CreateVSwitchRequest

# 変数の準備
# 東京リージョン(ap-northeast-1) に Zoneが2つある
CIRDER_BLOCK = "172.16.100.0/24"
ZONE_ID = "ap-northeast-1a"

request = CreateVSwitchRequest()
request.set_accept_format('json')
request.set_CidrBlock(CIRDER_BLOCK)
request.set_VpcId(VPC_ID)
request.set_ZoneId(ZONE_ID)

response = json.loads(client.do_action_with_exception(request))

# 確認
VSWITCH_ID = response["VSwitchId"]
print("VSWITCH_ID : " + VSWITCH_ID)
print("\n")
print(json.dumps(response, indent=4, sort_keys=True))

出力結果例:

SECURITY_GROUP_ID :  sg-6we2p57hosr5u4l1e100


{
    "RequestId": "E391B162-5CA6-480B-9B7E-5845BF242AA3",
    "SecurityGroupId": "sg-6we2p57hosr5u4l1e100"
}

image.png

2.2: ECS関連の作業

image.png

0: 諸環境の準備フェーズ
1: 構築フェーズ
    1.1: APIコールのClientの作成
    1.2: Alibaba Cloudの AccountIDの取得と確認
    1.3: OSS関連の作業   
    1.4: RAM関連の作業   
    1.5: ActionTrail関連の作業  
    1.6: FC関連の作業  
2: 動作確認フェーズ
    2.1: VPC関連の作業  
    2.2: ECS関連の作業  <------------------------------------------------- 今ここ
3: 片付けフェーズ
    3.1: ECS関連の作業
    3.2: VPC関連の作業
    3.3: FC関連の作業
    3.4: ActionTrail関連作業
    3.5: OSS関連作業
    3.6: RAM関連作業

2.2.0: ECS とは

Alibaba Cloud Elastic Compute Service (ECS) は、信頼性と拡張性に優れた分散コンピューティングリソースをオンデマンドで提供するオンラインコンピューティングサービスです。ECS を使用すると、クラウドコンピューティング環境を完全に制御できます。

2.2.1: Security Groupの作成

CreateSecurityGroup

コマンド:

###############################################################
# ECS
#   Security Group, ECS Instanceの作成
###############################################################

# Security Groupの作成
#  ECSインスタンスを作成する際に、Security Group の設定が必須
from aliyunsdkecs.request.v20140526.CreateSecurityGroupRequest import CreateSecurityGroupRequest

request = CreateSecurityGroupRequest()
request.set_accept_format('json')
request.set_VpcId(VPC_ID)
response = json.loads(client.do_action_with_exception(request))

# 確認
SECURITY_GROUP_ID = response["SecurityGroupId"]
print("SECURITY_GROUP_ID : " , SECURITY_GROUP_ID)
print("\n")
print(json.dumps(response, indent=4, sort_keys=True))

出力結果例:

SECURITY_GROUP_ID :  sg-6we2p57hosr5u4l1e100


{
    "RequestId": "E391B162-5CA6-480B-9B7E-5845BF242AA3",
    "SecurityGroupId": "sg-6we2p57hosr5u4l1e100"
}

2.2.2: ECS Instanceの作成

RunInstances

(RunInstancesの)ActionTrailログのサンプル

コマンド:

# ECS Instanceの作成
from aliyunsdkecs.request.v20140526.RunInstancesRequest import RunInstancesRequest

# 変数の準備
IMAGE_ID = "ubuntu_18_04_64_20G_alibase_20190624.vhd"
INSTANCE_TYPE = "ecs.t5-lc1m1.small" # ecs.t5-lc1m1.small / ecs.t5-lc1m2.small / ecs.t5-lc2m1.nano

# ImageID, Instance type, Security group, VSwitch, Zoneを指定する
request = RunInstancesRequest()
request.set_accept_format('json')
request.set_ImageId(IMAGE_ID)
request.set_InstanceType(INSTANCE_TYPE)
request.set_SecurityGroupId(SECURITY_GROUP_ID)
request.set_VSwitchId(VSWITCH_ID)
request.set_ZoneId(ZONE_ID)

# 確認
# ECS Instanceが作成されてから, Tagをつけられるまで(場合によって)2~3分かかる
response = json.loads(client.do_action_with_exception(request))
INSTANCE_ID = response["InstanceIdSets"]["InstanceIdSet"][0]
print("INSTANCE_ID :  ", INSTANCE_ID)
print("\n")
print(json.dumps(response, indent=4, sort_keys=True))

出力結果例:

INSTANCE_ID :   i-6we2p57hosr5u4kv712b


{
    "InstanceIdSets": {
        "InstanceIdSet": [
            "i-6we2p57hosr5u4kv712b"
        ]
    },
    "RequestId": "7940576C-0C22-4019-AD97-E99EA1396AA1"
}

2.2.3: Tagの確認

DescribeInstances

コマンド:

# Tagの確認
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
request = DescribeInstancesRequest()
request.set_accept_format('json')
request.set_InstanceIds('["' + INSTANCE_ID + '"]')

response = json.loads(client.do_action_with_exception(request))
print(json.dumps(response["Instances"]["Instance"][0]["Tags"], indent=4, sort_keys=True))

出力結果例(Tag付けされる前):

KeyError                                  Traceback (most recent call last)
<ipython-input-32-120be11c2ae2> in <module>
      6 
      7 response = json.loads(client.do_action_with_exception(request))
----> 8 print(json.dumps(response["Instances"]["Instance"][0]["Tags"], indent=4, sort_keys=True))

KeyError: 'Tags'

image.png

出力結果例(Tag付けされた後):

{
    "Tag": [
        {
            "TagKey": "Owner",
            "TagValue": "handson"
        }
    ]
}

uploading-0

3: 片付けフェーズ

[注意]Alibaba Cloudのリソースを削除する際に、リソース間の依存関係を考慮して、順番に削除する必要がある

0: 諸環境の準備フェーズ
1: 構築フェーズ
    1.1: APIコールのClientの作成
    1.2: Alibaba Cloudの AccountIDの取得と確認
    1.3: OSS関連の作業   
    1.4: RAM関連の作業   
    1.5: ActionTrail関連の作業  
    1.6: FC関連の作業  
2: 動作確認フェーズ
    2.1: VPC関連の作業  
    2.2: ECS関連の作業  
3: 片付けフェーズ  <------------------------------------------------- 今ここ
    3.1: ECS関連の作業
    3.2: VPC関連の作業
    3.3: FC関連の作業
    3.4: ActionTrail関連作業
    3.5: OSS関連作業
    3.6: RAM関連作業

3.1: ECS関連の作業

3.1.1: ECS Insatanceの停止

StopInstance

コマンド:

###############################################################
# ECS
#   ECS,Security Groupの削除
#   ※ ECS Instanceは停止の状態ではないと、削除できない
###############################################################

# ECS Insatanceの停止
#  codeの場合、ECS Instanceを停止してから、削除する
from aliyunsdkecs.request.v20140526.StopInstanceRequest import StopInstanceRequest

request = StopInstanceRequest()
request.set_accept_format('json')
request.set_InstanceId(INSTANCE_ID)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"DE4FCCD1-76C8-4A02-912C-FEEE25524BE1"}

3.1.2: ECS Insatanceの削除

DeleteInstance

コマンド:

# ECS Insatanceの削除
from aliyunsdkecs.request.v20140526.DeleteInstanceRequest import DeleteInstanceRequest

request = DeleteInstanceRequest()
request.set_accept_format('json')
request.set_InstanceId(INSTANCE_ID)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"DE4FCCD1-76C8-4A02-912C-FEEE25524BE1"}

3.1.3: Security Groupの削除

DeleteSecurityGroup

コマンド:

# Security Groupの削除
from aliyunsdkecs.request.v20140526.DeleteSecurityGroupRequest import DeleteSecurityGroupRequest

request = DeleteSecurityGroupRequest()
request.set_accept_format('json')
request.set_SecurityGroupId(SECURITY_GROUP_ID)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"DE4FCCD1-76C8-4A02-912C-FEEE25524BE1"}

3.2: VPC関連の作業

3.2.1: VSwitchの削除

DeleteVSwitch

コマンド:

###############################################################
# VPC
#   VPC, VSwitchの削除
###############################################################

# VSwitchの削除
from aliyunsdkvpc.request.v20160428.DeleteVSwitchRequest import DeleteVSwitchRequest

request = DeleteVSwitchRequest()
request.set_accept_format('json')
request.set_VSwitchId(VSWITCH_ID)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"DE4FCCD1-76C8-4A02-912C-FEEE25524BE1"}

3.2.2: VPCの削除

DeleteVpc

コマンド:

# VPCの削除
from aliyunsdkvpc.request.v20160428.DeleteVpcRequest import DeleteVpcRequest

request = DeleteVpcRequest()
request.set_accept_format('json')
request.set_VpcId(VPC_ID)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"DE4FCCD1-76C8-4A02-912C-FEEE25524BE1"}

3.3: FC関連の作業

3.3.1: OSS Triggerの削除

DeleteTrigger

コマンド:

###############################################################
# Function Compute
#   OSS Trigger,FC Function, FC Serviceの削除
#
# RAM Role
#   RoleのPolicyのDetach, Role削除
###############################################################

# OSS Triggerの削除
response = fc_client.delete_trigger(FC_SERVICE, FC_FUNCTION, OSS_TRIGGER)
print("Function Compute Trigger : ", response)

出力結果例:

Function Compute Trigger :  None

3.3.2: FC Functionの削除

DeleteFunction

コマンド:

# FC Functionの削除
response = fc_client.delete_function(FC_SERVICE, FC_FUNCTION)
print("Function Compute Function : ", response)

出力結果例:

Function Compute Function :  None

3.3.3: FC Serviceの削除

DeleteService

コマンド:

# FC Serviceの削除
response = fc_client.delete_service(FC_SERVICE)
print("Function Compute Service : ", response)

出力結果例:

Function Compute Service :  None

3.3.4: FC Roleから AliyunOSSFullAccess, AliyunECSFullAccess をDetach

DetachPolicyFromRole

コマンド:

# FC Roleから AliyunOSSFullAccess, AliyunECSFullAccess をDetach
from aliyunsdkram.request.v20150501.DetachPolicyFromRoleRequest import DetachPolicyFromRoleRequest

request = DetachPolicyFromRoleRequest()
request.set_accept_format('json')
request.set_PolicyType("System")
request.set_PolicyName("AliyunOSSFullAccess")
request.set_RoleName(FC_ROLE)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

request.set_PolicyName("AliyunECSFullAccess")
response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"771894E5-E539-492E-B9B5-752319BDE965"}
{"RequestId":"B7D88E8B-98B6-41AF-9FFD-382B85A780F4"}

3.3.5: FC Roleの削除

ロールの削除 (DeleteRole)

コマンド:

from aliyunsdkram.request.v20150501.DeleteRoleRequest import DeleteRoleRequest

request = DeleteRoleRequest()
request.set_accept_format('json')
request.set_RoleName(FC_ROLE)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"771894E5-E539-492E-B9B5-752319BDE965"}

3.3.6: OSS Trigger Roleから AliyunOSSEventNotificationRolePolicy をDetach

コマンド:

# OSS Trigger Roleから AliyunOSSEventNotificationRolePolicy をDetach
request = DetachPolicyFromRoleRequest()
request.set_accept_format('json')
request.set_PolicyType("System")
request.set_PolicyName("AliyunOSSEventNotificationRolePolicy")
request.set_RoleName(OSS_INVOCATION_ROLE)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"771894E5-E539-492E-B9B5-752319BDE965"}
{"RequestId":"B7D88E8B-98B6-41AF-9FFD-382B85A780F4"}

3.3.7: OSS Trigger Roleの削除

コマンド:

# OSS Trigger Roleの削除
request = DeleteRoleRequest()
request.set_accept_format('json')
request.set_RoleName(OSS_INVOCATION_ROLE)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"DA7DB2A3-269C-4B6D-BBDF-4B73BFCE1994"}

3.4: ActionTrail関連作業

3.4.1: ActionTrailの削除

DeleteTrail

コマンド:

###############################################################
# ActionTrail
#   Trailの削除
#
# RAM Role
#   RoleのPolicyのDetach, Role削除
###############################################################

# ActionTrailの削除
from aliyunsdkactiontrail.request.v20171204.DeleteTrailRequest import DeleteTrailRequest

request = DeleteTrailRequest()
request.set_accept_format('json')
request.set_Name(ACTION_TRAIL)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"DA7DB2A3-269C-4B6D-BBDF-4B73BFCE1994"}

3.4.2: AliyunActionTrailDefaultRole から AliyunActionTrailRolePolicy をDetach

DetachPolicyFromRole

コマンド:

# [Role] AliyunActionTrailDefaultRole から AliyunActionTrailRolePolicy をDetach
request = DetachPolicyFromRoleRequest()
request.set_accept_format('json')
request.set_PolicyType("System")
request.set_PolicyName("AliyunActionTrailRolePolicy")
request.set_RoleName(ACTION_TRAIL_ROLE)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"DA7DB2A3-269C-4B6D-BBDF-4B73BFCE1994"}

3.4.3: AliyunActionTrailDefaultRole の削除

ロールの削除 (DeleteRole)

コマンド:

# [Role] AliyunActionTrailDefaultRole の削除
request = DeleteRoleRequest()
request.set_accept_format('json')
request.set_RoleName(ACTION_TRAIL_ROLE)

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

出力結果例:

{"RequestId":"DA7DB2A3-269C-4B6D-BBDF-4B73BFCE1994"}

3.5: OSS関連作業

3.5.1: OSS Objectの削除

コマンド:

###############################################################
# OSS
#   OSS Object, OSS Bucketの削除
###############################################################

# OSS Objectの削除
bucket = oss2.Bucket(oss2.Auth(ACCESS_KEY_ID, ACCESS_KEY_SECRET), OSS_ENDPOINT, OSS_BUCKET)

for obj in oss2.ObjectIterator(bucket):
    list = obj.key.split("/")
    oss_object = list[-1]
    response = bucket.delete_object(obj.key)
    print("Delete OSS Object ",oss_object, " , Status Code : ", response.status)
    # 出力例: Delete OSS Object  HelloWorld.py  :  204

出力結果例:

Delete OSS Object  Actiontrail_ap-northeast-1_20190826055055_1002_1_666_fd5e1891bfb2be089c3d975b481c668a.gz  , Status Code :  204
Delete OSS Object  Actiontrail_ap-northeast-1_20190826060521_1002_2_796_e3aedc1ac46c7143d0ac0c4f03b4130d.gz  , Status Code :  204
Delete OSS Object  Actiontrail_ap-northeast-1_20190826060600_1002_2_832_24071ce00d1ffc27cc1f53e86af45db6.gz  , Status Code :  204
Delete OSS Object  Actiontrail_ap-northeast-1_20190826061705_1002_1_477_dad1f031744547ae9f37bac3138c725f.gz  , Status Code :  204
* * *
* * * 

3.5.2: OSS Bucketの削除

コマンド:

# OSS Bucketの削除
response = bucket.delete_bucket()
print("Delete OSS Bucket ",OSS_BUCKET, " , Status Code : ", response.status)

コマンド:

Delete OSS Bucket  action-trail-log-5644*****921  , Status Code :  204

3.6: RAM関連作業

[超重要] 必ず実施してください !
Alibaba Cloudアカウントにログインして、ハンズオン最初に作成したRAM Userを削除します。

3.7: 作業終了

以上、AliEaters Code支部#2 の作業はすべて終了しました ! お疲れ様でした !

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?